次のようなクラスがあります。
@XmlRootElement(namespace = "http://foo.com/model", name = "Person")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://foo.com/model", name = "Person"
public abstract Person {
}
そして、それを継承する 2 つのクラス:
@XmlRootElement(namespace = "http://foo.com/model", name = "ShortPerson")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://foo.com/model", name = "ShortPerson"
public ShortPerson extends Person {
}
@XmlRootElement(namespace = "http://foo.com/model", name = "TallPerson")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://foo.com/model", name = "TallPerson"
public TallPerson extends Person {
}
それから私はそのようなSEIを持っています:
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED, use = SOAPBinding.Use.LITERAL, style = SOAPBinding.Style.DOCUMENT)
@WebService(targetNamespace = "http://foo.com/services")
public interface PersonService {
@RequestWrapper(localName = "getPersonById", className = "com.foo.services.personService.GetPersonById", targetNamespace = "http://foo.com/services")
@ResponseWrapper(localName = "getPersonByIdResponse", className = "com.foo.services.personService.GetPersonByUidResponse", targetNamespace = "http://foo.com/services")
@WebResult(targetNamespace = "http://foo.com/model", name = "Person")
Person getPersonById(
@WebParam(targetNamespace = "http://foo.com/services", name = "PersonId") Long personId);
}
そして、私の応答ラッパー クラスは次のようになります。
@XmlRootElement(name = "getPersonByIdResponse", namespace = "http://foo.com/services")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getPersonByIdResponse", namespace = "http://foo.com/services", propOrder = { "person" })
public class GetPersonByIdResponse {
@XmlElementRefs( {
@XmlElementRef(name = "TallPerson", type = TallPerson.class, namespace = "http://foo.com/model"),
@XmlElementRef(name = "SmallPerson", type = SmallPerson.class, namespace = "http://foo.com/model")
})
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
したがって、ここでの問題は、JAXB を介して ResponseWrapper を直接テストし、TallPerson オブジェクトを設定すると、そのオブジェクトを TallPerson に固有の XML に正しくマーシャリングすることです (SmallPerson でも同じことができます)。
問題は、これを戦争に展開してサービスを有効にすると、TallPerson の結果が返されたときに、空のメッセージを除いて Web サービス呼び出しから何も受信しないことです。実際、<getPersonByIdResponse> のレスポンス ラッパー ルート XML 要素も受信しません。
したがって、私の問題は、多態的な要求または応答オブジェクト (この場合は応答オブジェクト) がある場合、WebResult の名前/ターゲット名前空間が ResponseWrapper 内のパラメーターにどのように影響するかです。私の場合、XmlElementRefs を利用して、基本オブジェクト Person を TallPerson または SmallPerson に正しくマーシャリングしていますが、これは WebResult の親クラス Person の名前空間/名前とどのように関連していますか? 競合が原因で XML 応答が生成されないかどうかはわかりません。
ありがとう