2013-05-16 9 views
5

Użyłem wcześniej JAX-WS, ale wcześniej nie przekazywałem niestandardowego obiektu jako parametru. Używam GlassFish 3.1, NetBeans 7.3 i tworzę usługi za pomocą kreatora JAX-WS NetBeans. Mój problem polega na tym, że niestandardowy obiekt (kryteria) przekazany do usługi jest odbierany jako wartość NULL na serwerze. Mogę pomyślnie przekazywać typy domyślne, takie jak int.Obiekt niestandardowy JAX-WS odebrany na żądanie ma wartość null

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

Czy coś mi brakuje jak adnotacji czy coś?

Wiadomość wysłana wyglądał następująco:

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

Jak wygląda wiadomość, którą wysyłasz? –

+0

@BlaiseDoughan: Edytowałem wpis, aby dodać wysłaną wiadomość. Dziękuję Ci. – user2361862

+0

Czy rozwiązałeś to proszę? –

Odpowiedz

1
  1. getParameter/setParameter metody nie wynika JavaBeans convension. Jeśli nie chcesz tego nie robić, używaj numeru @XmlAccessorType(XmlAccessType.FIELD) na poziomie klasy - JAXB będzie szukał pól, a nie metod.
  2. getParameter/setParameters pracować z rodzaju mapy, można to zrobić, ale z jakiejś dodatkowej pracy (JAXB java.util.Map binding)
  3. gettype/setType są tylko „odpowiednie” metody para, więc są właściwie traktowane przez JAXB
3

Spróbuj dodać targetNamespace do adnotacji WebParam, z przestrzenią nazw schematu.

Zmierzyłem się z tym samym problemem. Element główny był domyślnie nazwany obszarem nazw usługi zamiast obszaru nazw schematu. Dodałem targetNamespace do WebParam i to pomogło rozwiązać ten problem.

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

Nie mogę jeszcze komentować (zbyt niska reputacja), ale rozwiązałem ten problem. Moje rozwiązanie było zmienić nazwę @WebParam tak, że ma nie nazwę klasy:

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

zamiast

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

nie wiem dlaczego go zdarza się jednak. Może ktoś może dać wgląd.

Powiązane problemy