Olá,
estou estudando JAX-WS e estou tentando aprender a usar os WebParam.Mode (IN, OUT e INOUT).
Para testes, criei a seguinte interface:
@WebService
public interface InAndOutModeService {
@WebMethod
void createPerson( @WebParam(mode=Mode.OUT) Holder<Person> person);
@WebMethod
void createPlayer( @WebParam(mode=Mode.IN) Holder<Player> player);
}
Abaixo, a implementação do serviço:
@WebService(endpointInterface="ws.InAndOutModeService")
public class InAndOutModeServiceImpl implements InAndOutModeService {
@Override
public void createPerson(Holder<Person> person) {
person.value.setName("Person's name");
}
@Override
public void createPlayer(Holder<Player> player) {
System.out.println(player);
}
}
Abaixo, as classes utilizadas como parâmetro:
Person:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
}
Player:
public class Player extends Person {
private Integer number;
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
@Override
public String toString() {
return "Player [number=" + number + ", getName()=" + getName() + "]";
}
}
Quando tento subir o serviço, esta exceção é lançada:
Exception in thread "main" javax.xml.ws.WebServiceException: class ws.jaxws.CreatePlayerResponse do not have a property of the name arg0
at com.sun.xml.internal.ws.server.sei.EndpointResponseMessageBuilder$DocLit.<init>(EndpointResponseMessageBuilder.java:195)
at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.createResponseMessageBuilder(EndpointMethodHandler.java:191)
at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.<init>(EndpointMethodHandler.java:97)
at com.sun.xml.internal.ws.server.sei.PayloadQNameBasedDispatcher.<init>(PayloadQNameBasedDispatcher.java:95)
at com.sun.xml.internal.ws.server.sei.EndpointMethodDispatcherGetter.<init>(EndpointMethodDispatcherGetter.java:61)
at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.<init>(SEIInvokerTube.java:64)
at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:194)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:456)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:475)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:213)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:143)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:102)
at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
at main.Main.main(Main.java:19)
Caused by: javax.xml.bind.JAXBException: arg0 is not a valid property on class ws.jaxws.CreatePlayerResponse
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:931)
at com.sun.xml.internal.ws.server.sei.EndpointResponseMessageBuilder$DocLit.<init>(EndpointResponseMessageBuilder.java:192)
... 13 more
Como estou apenas estudando (não vou publicar meus serviços em ambiente de produção), estou usando a classe Endpoint para publicá-los:
Endpoint.publish(IN_AND_OUT_MODE_TEST_SERVICE_URL, new InAndOutModeServiceImpl());
Alguém sabe o que estou fazendo de errado?
Obrigado,
Abraço!