2015-02-26 1 views
3

Это происходит, когда я использую более новую версию wsimport. Пример WSDL ниже содержит SimpleType «SomeEnum», который становится перечислением в классе JAXB. У меня есть код, который генерирует XSD-схему обратно из класса JAXB и ранее он правильно присваивал этому типу тип tns: SomeEnum, но теперь рассматривает его как строку.Почему wsimport добавляет @XmlSchemaType (name = "string")?

В конце концов я обнаружил, что wsimport добавлял аннотацию @XmlSchemaType (name = "string"), вызывая это поведение. Это кажется мне неправильным, потому что существует более конкретный тип, чем строка. Он также разбивает код, который зависит от обратной схемы.

Вот самый маленький WSDL, который я смог придумать, чтобы воспроизвести ошибку.

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions 
    targetNamespace="http://foo.bar.com/example" 
    xmlns:tns="http://foo.bar.com/example" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <wsdl:types> 
    <schema elementFormDefault="qualified" jaxb:version="1.0" 
     targetNamespace="http://foo.bar.com/example" 
     xmlns="http://www.w3.org/2001/XMLSchema" 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:tns="http://foo.bar.com/example"> 
     <annotation> 
     <appinfo> 
      <jaxb:globalBindings typesafeEnumMaxMembers="999999"/> 
     </appinfo> 
     </annotation> 
     <complexType name="Wrapper"> 
     <sequence> 
      <element maxOccurs="1" minOccurs="0" name="someEnum" type="tns:SomeEnum"/> 
     </sequence> 
     </complexType> 
     <simpleType name="SomeEnum"> 
     <restriction base="xsd:string"> 
      <enumeration value="SOME_VALUE"/> 
      <enumeration value="ANOTHER_VALUE"/> 
     </restriction> 
     </simpleType> 
     <element name="doesNothing"> 
     <complexType> 
      <sequence> 
      </sequence> 
     </complexType> 
     </element> 
    </schema> 
    </wsdl:types> 

    <wsdl:message name="doesNothingRequest"> 
    <wsdl:part element="tns:doesNothing" name="parameters"/> 
    </wsdl:message> 

    <wsdl:portType name="SimpleTypeIssueServiceInterface"> 
    <wsdl:operation name="doesNothing"> 
     <wsdl:input message="tns:doesNothingRequest" name="doesNothingRequest"/> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="SimpleTypeIssueServiceSoapBinding" type="tns:SimpleTypeIssueServiceInterface"> 
    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="doesNothing"> 
     <wsdlsoap:operation soapAction=""/> 
     <wsdl:input name="doesNothingRequest"> 
     <wsdlsoap:body use="literal"/> 
     </wsdl:input> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="SimpleTypeIssueService"> 
    <wsdl:port binding="tns:SimpleTypeIssueServiceSoapBinding" name="SimpleTypeIssueServiceInterfacePort"> 
     <wsdlsoap:address location="LOCATION_TEMPLATE"/> 
    </wsdl:port> 
    </wsdl:service> 

И вот фрагмент сгенерированного Wrapper.java. Аннотации @XmlSchemaType отсутствуют в Java7 wsimport (который я хочу) и присутствуют в Java8 wsimport. Я не знаю, исправляет ли это ошибку или представляет ее.

... 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Wrapper", propOrder = { 
    "someEnum" 
}) 
public class Wrapper { 

    @XmlSchemaType(name = "string") // [Why is this added?] 
    protected SomeEnum someEnum; 

    /** 
    * Gets the value of the someEnum property. 
    * 
    * @return 
    *  possible object is 
    *  {@link SomeEnum } 
    * 
    */ 
    public SomeEnum getSomeEnum() { 
     return someEnum; 
    } 
... 
} 

ответ

Смежные вопросы