2013-05-16 35 views
5

我以前用過的JAX-WS,但在此之前沒有通過自定義對象作爲參數。我正在使用GlassFish 3.1,NetBeans 7.3並通過NetBeans JAX-WS嚮導創建服務。 我的問題是當自定義對象(標準)傳遞給服務在服務器上接收爲空。我可以成功傳遞像int這樣的默認類型。在請求中接收到JAX-WS自定義對象爲空

@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> 
+0

這是什麼,你都喜歡看發送消息? –

+0

@BlaiseDoughan:我編輯了帖子以添加發送的消息。謝謝。 – user2361862

+0

你有沒有解決這個問題? –

回答

1
  1. 的getParameter /的setParameter方法不遵循JavaBean的convension。如果你不想不遵循在類級別這個convension使用@XmlAccessorType(XmlAccessType.FIELD) - JAXB會看場,而不是方法。
  2. 的getParameter/setParameters與地圖類型的工作,是可以做到的,但也有一些額外的工作(JAXB java.util.Map binding
  3. 的getType /的setType是唯一的「正確」的方法對,所以它們被JAXB
妥善處理
3

嘗試增加目標名稱到WebParam註釋,與架構的命名空間。

我面臨着同樣的問題。根元素默認爲服務名稱空間而不是模式名稱空間。我將targetNamespace添加到WebParam,並幫助解決了這個問題。

@WebResult(name="status") 
public String send(@WebParam(name="event",targetNamespace="http://efw/event/schema") EventType event); 
0

我還不能評論(信譽太低),但我解決了這個問題。我的解決辦法是改變@WebParam的名稱,以便它具有類的不是名稱:我不知道

public List<Revision> listRevisions(@WebParam(name="crit")Criteria criteria) {

,而不是

public List<Revision> listRevisions(@WebParam(name="criteria")Criteria criteria) {

爲什麼雖然發生。也許有人可以提供一個見解。

相關問題