4

次のようなクラスがあります。

@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 応答が生成されないかどうかはわかりません。

ありがとう

4

1 に答える 1