2013-05-16 23 views
5

Daha önce JAX-WS kullandım, ancak daha önce bir parametre olarak özel bir nesneyi geçmedim. NetBeans JAX-WS sihirbazı aracılığıyla GlassFish 3.1, NetBeans 7.3 kullanıyorum ve oluşturulan hizmetler. Sorunum, hizmete geçirilen özel nesne (Kriterler) sunucuda null olarak alındığında benim sorunumdur. Int gibi varsayılan türleri başarılı bir şekilde geçirebilirim.JAX-WS özel nesnesi boş

@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; 
    } 
} 

Ben açıklama falan gibi eksik bir şey var mı? gönderilen

Mesaj şuna benziyordu:

<?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

Gönderdiğiniz ileti nasıl görünüyor? –

+0

@BlaiseDoughan: Gönderilen mesajı eklemek için gönderiyi düzenledim. teşekkür ederim. – user2361862

+0

Bunu çözdünüz mü lütfen? –

cevap

1
  1. getParameter/setParameter yöntemler JavaBean esası takip etmez. Bu konveksiyonu takip etmek istemiyorsanız, sınıf düzeyinde @XmlAccessorType(XmlAccessType.FIELD) kullanın - JAXB, yöntemlere değil, alanlara bakar.
  2. /setParameters Harita türü ile çalışmak getParameter
  3. , bu yapılabilir , ancak bazı ek çalışma ile (JAXB java.util.Map binding)
  4. gettype/setType sadece "doğru" yöntemleri çifti vardır, bu yüzden doğru
JAXB tarafından tedavi edilir
3

Şema ad alanıyla birlikte WebParam ek açıklamasına targetNamespace eklemeyi deneyin.

Aynı sorunla karşılaştım. Kök öğesi, şema ad alanı yerine hizmet ad alanına varsayılan olarak ayarlandı. WebParam'a targetNamespace özelliğini ekledim ve bu sorunun çözümünde yardımcı oldu.

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

henüz (çok düşük itibar) yorum yapamam ama bu sorun çözüldü. o Sınıf ait değil ada sahip olacak şekilde Çözümümün @WebParam adını değiştirmek oldu: Bilmiyorum

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

yerine

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

neden bunu olsa olur. Belki birisi bir fikir verebilir.