Use JAXWS enableWrapperStyle while generating Java

2019-06-03 02:20发布

问题:

I'm trying to generate Java source from XSD and have to disable wrapper style with JAXWS. I've written the custom binding but it seems that JAXWS doesn't work with XJC. The binding I use is pretty simple.

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns="http://java.sun.com/xml/ns/jaxws"
version="2.1" jaxb:extensionBindingPrefixes="xjc">

<jaxb:bindings>
    <jaxb:globalBindings typesafeEnumMaxMembers="2000" generateElementProperty="false" >
         <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    </jaxb:globalBindings>
</jaxb:bindings>

If I'm trying to run the ant script I'm getting following error messages.

 [xjc] [ERROR] Unsupported binding namespace "http://java.sun.com/xml/ns/jaxws". Perhaps you meant "http://java.sun.com/xml/ns/jaxb/xjc"?
  [xjc]   line 2 of file:/D:/xxxxxxxxxx/xxxxx/xxxx.xsd
  [xjc] [ERROR] cvc-complex-type.2.4.a: Invalid content was found starting with element 'jaxws:enableWrapperStyle'. One of '{"http://java.sun.com/xml/ns/jaxb":javaType, "http://java.sun.com/xml/ns/jaxb":serializable, "http://java.sun.com/xml/ns/jaxb/xjc":serializable, "http://java.sun.com/xml/ns/jaxb/xjc":superClass, "http://java.sun.com/xml/ns/jaxb/xjc":superInterface, "http://java.sun.com/xml/ns/jaxb/xjc":typeSubstitution, "http://java.sun.com/xml/ns/jaxb/xjc":smartWildcardDefaultBinding, "http://java.sun.com/xml/ns/jaxb/xjc":simple, "http://java.sun.com/xml/ns/jaxb/xjc":treatRestrictionLikeNewType, "http://java.sun.com/xml/ns/jaxb/xjc":javaType, "http://java.sun.com/xml/ns/jaxb/xjc":generateElementProperty, "http://java.sun.com/xml/ns/jaxb/xjc":noMarshaller, "http://java.sun.com/xml/ns/jaxb/xjc":noUnmarshaller, "http://java.sun.com/xml/ns/jaxb/xjc":noValidator, "http://java.sun.com/xml/ns/jaxb/xjc":noValidatingUnmarshaller}' is expected.
  [xjc]   line 8 of file:/D:/xxxxxxxxxx/xxxxx/xxxx/xsd/xsd-binding.xml

I have already tryed to use only jaxws, but XJC extpects JAXB as main binding. With this binding:

<bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://java.sun.com/xml/ns/jaxws"
    jaxb:version="2.1" extensionBindingPrefixes="xjc annox">
    <enableWrapperStyle>false</enableWrapperStyle>
    <jaxb:bindings>
        <jaxb:globalBindings typesafeEnumMaxMembers="2000" generateElementProperty="false" />
    </jaxb:bindings>
</bindings>

I'm getting the error:

[xjc] [ERROR] not an external binding file. The root element must be {http://java.sun.com/xml/ns/jaxb}bindings but it is {http://java.sun.com/xml/ns/jaxws}bindings
      [xjc]   line ? of file:/D:/xxxxxx/xsd-binding.xml
      [xjc] [ERROR] Unexpected <bindings> appears at line 4 column 61
      [xjc]   line 4 of file:/D:/xxxxxx/xsd-binding.xml

Is it possible to use the jaxws:enableWrapperStyle inside of jaxb? If yes, what have I overlooked? Thank you in advance!

回答1:

I've found the solution. JAXWS-element has to be inside of JAXB-element and has to be declared as follows:

<?xml version="1.0"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1" jaxb:extensionBindingPrefixes="xjc annox">
    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    </jaxws:bindings>
    <jaxb:bindings>
        <jaxb:globalBindings typesafeEnumMaxMembers="2000" generateElementProperty="false"/>
    </jaxb:bindings>
</jaxb:bindings>


回答2:

You have the jaxws namespace added twice in the above example

    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns="http://java.sun.com/xml/ns/jaxws"

Remove the second one:

 xmlns="http://java.sun.com/xml/ns/jaxws" <--REMOVE THIS