Это происходит, когда я использую более новую версию 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;
}
...
}