Пользовательский объект JAX-WS, полученный в запросе, является нулевым
Я раньше использовал JAX-WS, но раньше не передавал пользовательский объект в качестве параметра. Я использую GlassFish 3.1, NetBeans 7.3 и создаю сервисы с помощью мастера JAX-WS NetBeans. Моя проблема заключается в том, что пользовательский объект (Критерии), переданный службе, принимается как нулевой на сервере. Я могу успешно передавать типы по умолчанию, такие как int.
@WebService(serviceName = "ECLService")
@Stateless()
public class ECLService {
@EJB
PersistenceImpl persistence;
@WebMethod(operationName = "listRevisions")
public List<Revision> listRevisions(@WebParam(name="criteria")Criteria criteria) {
System.out.println("criteria is "+(criteria ==null ? "null":" not null"));
List<Revision> revisions = persistence.getRevisions(criteria);
return revisions;
}
}
Criteria.java
@XmlRootElement
public class Criteria implements Serializable {
private static final long serialVersionUID = 1L;
public static final String LIST_TYPE = "criteria.key.listtype";
public static final String TYPE_ALL = "criteria.value.all";
public static final String TYPE_ERROR = "criteria.value.error";
public static final String TYPE_ARCHIVE = "criteria.value.archive";
public static final String TYPE_APPROVAL = "criteria.value.approval";
private Map<String, String> parameters;
public Map<String, String> getParameters() {
return parameters;
}
public String getParameter(String key) {
if (parameters==null || key==null) {
return null;
} else {
return parameters.get(key);
}
}
public void setParameters(Map<String, String> parameters) {
this.parameters = parameters;
}
public void setParameter(String key, String value) {
if (parameters==null) {
parameters = new HashMap<String,String>();
}
parameters.put(key, value);
}
public void setType(String type) {
setParameter(LIST_TYPE, type);
}
public String getType() {
return getParameter(LIST_TYPE);
}
@Override
public int hashCode() {
int hash = 7;
hash = 43 * hash + (this.parameters != null ? this.parameters.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Criteria other = (Criteria) obj;
if (this.parameters != other.parameters && (this.parameters == null || !this.parameters.equals(other.parameters))) {
return false;
}
return true;
}
}
Я что-то упускаю, например, аннотации или что-то в этом роде?
Отправленное сообщение выглядело так:
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><ns2:listRevisions xmlns:ns2="http://webservice.ecl.abc.com/"><ns2:criteria>
<type>TYPE_ALL</type></ns2:criteria></ns2:listRevisions></S:Body></S:Envelope>
HTTP/1.1 200 OK
server: grizzly/1.9.50
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Fri, 17 May 2013 07:37:15 GMT
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body>
<ns2:listRevisionsResponse xmlns:ns2="http://webservice.ecl.abc.com/"/></S:Body>
</S:Envelope>
3 ответа
Попробуйте добавить targetNamespace к аннотации WebParam вместе с пространством имен схемы.
Я столкнулся с той же проблемой. Корневым элементом по умолчанию было пространство имен службы вместо пространства имен схемы. Я добавил targetNamespace в WebParam, и это помогло решить эту проблему.
@WebResult(name="status")
public String send(@WebParam(name="event",targetNamespace="http://efw/event/schema") EventType event);
- Методы getParameter/setParameter не следуют соглашению JavaBean. Если вы не хотите не следовать этому условному соглашению
@XmlAccessorType(XmlAccessType.FIELD)
на уровне класса - JAXB будет смотреть на поля, а не методы. - getParameter/setParameters работает с типом Map, это может быть сделано, но с некоторой дополнительной работой ( JAXB java.util.Map привязка)
- getType / setType - единственная пара "правильных" методов, поэтому они правильно обрабатываются JAXB
Я пока не могу комментировать (слишком низкая репутация), но я решил эту проблему. Мое решение состояло в том, чтобы изменить имя @WebParam
так что у него нет названия класса:
public List<Revision> listRevisions(@WebParam(name="crit")Criteria criteria) {
вместо
public List<Revision> listRevisions(@WebParam(name="criteria")Criteria criteria) {
Я не знаю, почему это происходит, хотя. Может быть, кто-то может дать представление.