Jaxb 请求中接收到的JAX-WS自定义对象为空

Jaxb 请求中接收到的JAX-WS自定义对象为空,jaxb,jax-ws,jax-ws-customization,Jaxb,Jax Ws,Jax Ws Customization,我以前使用过JAX-WS,但以前没有将自定义对象作为参数传递。我正在使用GlassFish 3.1、NetBeans 7.3,并通过NetBeans JAX-WS向导创建服务。 我的问题是,当传递给服务的自定义对象(条件)在服务器上被接收为null时。我可以成功地传递int之类的默认类型 @WebService(serviceName=“ECLService”) @无国籍的 公共服务{ @EJB 持久性;持久性; @WebMethod(operationName=“listRevisions”)

我以前使用过JAX-WS,但以前没有将自定义对象作为参数传递。我正在使用GlassFish 3.1、NetBeans 7.3,并通过NetBeans JAX-WS向导创建服务。 我的问题是,当传递给服务的自定义对象(条件)在服务器上被接收为null时。我可以成功地传递int之类的默认类型

@WebService(serviceName=“ECLService”)
@无国籍的
公共服务{
@EJB
持久性;持久性;
@WebMethod(operationName=“listRevisions”)
公共列表列表修订(@webgram(name=“criteria”)标准){
System.out.println(“条件是”+(条件==null?“null”:“非null”);
列表修订=persistence.getRevisions(标准);
返回修订;
}
}
Criteria.java

@XmlRootElement
公共类条件实现可序列化{
私有静态最终长serialVersionUID=1L;
公共静态最终字符串列表\u TYPE=“criteria.key.listtype”;
公共静态最终字符串类型\u ALL=“criteria.value.ALL”;
公共静态最终字符串类型\u ERROR=“criteria.value.ERROR”;
公共静态最终字符串类型\u ARCHIVE=“criteria.value.ARCHIVE”;
公共静态最终字符串类型\u APPROVAL=“criteria.value.APPROVAL”;
私有映射参数;
公共映射getParameters(){
返回参数;
}
公共字符串getParameter(字符串键){
if(参数==null | |键==null){
返回null;
}否则{
返回参数get(key);
}
}
公共void setParameters(映射参数){
此参数=参数;
}
public void setParameter(字符串键、字符串值){
if(参数==null){
参数=新的HashMap();
}        
参数。put(键、值);
}
公共void集合类型(字符串类型){
setParameter(列表类型,类型);
}
公共字符串getType(){
返回getParameter(列表类型);
}
@凌驾
公共int hashCode(){
int hash=7;
hash=43*hash+(this.parameters!=null?this.parameters.hashCode():0);
返回散列;
}
@凌驾
公共布尔等于(对象obj){
if(obj==null){
返回false;
}
如果(getClass()!=obj.getClass()){
返回false;
}
最终标准其他=(标准)obj;
如果(this.parameters!=other.parameters&&(this.parameters==null | |!this.parameters.equals(other.parameters))){
返回false;
}
返回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>

所有类型
HTTP/1.1200ok
服务器:grizzly/1.9.50
内容类型:text/xml;字符集=utf-8
传输编码:分块
日期:2013年5月17日星期五格林尼治标准时间07:37:15
  • getParameter/setParameter方法不遵循JavaBean约定。如果您不想遵循此约定,请在类级别使用
    @xmlacessortype(xmlacesstype.FIELD)
    ——JAXB将查看字段,而不是方法
  • getParameter/setParameters使用映射类型,可以完成,但需要一些额外的工作()
  • getType/setType是唯一的“正确”方法对,因此JAXB会正确处理它们

  • 尝试使用架构的命名空间将targetNamespace添加到WebParam批注

    我也面临同样的问题。根元素默认为服务命名空间,而不是架构命名空间。我将targetNamespace添加到WebParam中,这有助于解决此问题

    @WebResult(name="status")
    public String send(@WebParam(name="event",targetNamespace="http://efw/event/schema") EventType event);
    
    我还不能评论(声誉太低),但我解决了这个问题。我的解决方案是更改
    @webgram
    的名称,使其具有而不是类的名称

    公共列表修订(@WebParam(name=“crit”)标准){

    而不是

    公共列表修订(@WebParam(name=“criteria”)标准){


    我不知道为什么会发生这种情况。也许有人能提供一些见解。

    你发送的消息是什么样子的?@BlaiseDoughan:我已经编辑了这篇文章以添加发送的消息。谢谢。你解决了这个问题吗?