2011-10-23 11 views
13

Sto creando un servizio Web utilizzando JAX-WS. Ho uno strano problema che l'annotazione @XmlElement(required=true) per @WebParam funziona in alcune classi @WebService, ma non funziona in alcune altre.@XmlElement (required = true) per @WebParam non funziona

Ho un codice molto simile nelle due classi @WebService. Cosa potrebbe causare questo problema? Tipo di parametro o classe entità?

Edit: Aggiungere il codice di esempio

Ho due servizi web:

@WebService(name = "ClubMemberPortType", serviceName = "ClubMemberService", portName = "ClubMemberSoapPort", targetNamespace = "http://club.com/api/ws") 
public class ClubMemberWS { 
@WebMethod(operationName = "findClubMembersByClubId", action = "urn:findClubMembersByClubId") 
    @WebResult(name = "club_membership") 
    public List<ClubMembership> findClubMembershipsByClubId(@XmlElement(required=true) 
                 @WebParam(name = "club_id") String clubId, 
                 @WebParam(name = "status") StatusEnum status){ 
... 
}} 

e

@WebService(name = "ClubPortType", serviceName = "ClubService", portName = "ClubSoapPort", targetNamespace = "http://club.com/api/ws") 
public class ClubWS { 
@WebMethod(operationName = "findClubByClubId", action = "urn:findClubByClubId") 
    @WebResult(name = "club") 
    public Club findClubByClubId(@XmlElement(required=true) 
           @WebParam(name = "club_id") String clubId) { 
... 
}} 

Lo schema generato per il primo metodo web è:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://club.com/api/ws"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ws:findClubMembersByClubId> 
     <club_id>?</club_id> 
     <!--Optional:--> 
     <status>?</status> 
     </ws:findClubMembersByClubId> 
    </soapenv:Body> 
</soapenv:Envelope> 

Lo schema generato per il secondo metodo web è:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://club.com/api/ws"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ws:findClubByClubId> 
     <!--Optional:--> 
     <club_id>?</club_id> 
     </ws:findClubByClubId> 
    </soapenv:Body> 
</soapenv:Envelope> 

Così il primo funziona bene, la seconda non funziona. Come è possibile? :(

+0

Eventuali esempi di codice per i due casi? Il problema reale che stai affrontando (ad esempio eccezioni, migliore descrizione del comportamento, ecc.)? –

+1

Ho aggiunto il codice. – Shichao

+0

Si prega di aggiungere lo stacktrace dell'errore – Tomer

risposta

3

ho lo stesso problema. Ho trovato la soluzione nel usando di classe separata per i parametri di metodo di servizio.

esempio

@XmlType(name="SampleRequestType", propOrder={"title", "ref"}) 
public class SampleRequest { 
    @XmlElement(name="title", required=false) 
    private String title; 
    @XmlElement(name="ref", required=true) 
    private String ref; 
    ... 

web-metodo

@WebMethod 
public String sampleMethod(@WebParam(name = "params") SampleRequest params) { 

forse questa volontà help

+2

Se lo facciamo in questo modo, 'SampleRequestType' mostra di per sé opzionale – NamingException

0

Si prova a modificare l'ordine in @WebParam e @XmlElement? effettivamente ho un briciolo WS questo:

public Persona consultarPersona(@WebParam(name = "cedula") @XmlElement(required=true, nillable=false, name="cedula", namespace="cedulaParam") String cedula) 

E la descrizione generano è:

<xsd:schema> 
<xsd:import namespace="cedulaParam" schemaLocation="http://eniacstein-pc:8080/WSDL_Sample/GestorPersonas?xsd=2"/> 
</xsd:schema> 

e la definizione dello schema:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="cedulaParam"> 
<xs:element name="cedula" type="xs:string"/> 
</xs:schema> 

il gioco è fatto !!

4

L'aggiunta di @XmlElement(required=true,nillable=false) dopo @WebParam ha risolto il mio problema simile. Utilizzando CXF 2.7.9. Non ho provato a mettere prima @XmlElement, potrebbe essere così semplice?

+0

Come ottenere l'annotazione '@XmlElement per questo percorso.» Come risolvere questo problema Utilizzo di RSA per lo sviluppo Se ho bisogno di aggiornare la versione cxf, Gentilmente aiuto con il link maven con la versione – Rajesh

2

Se si hanno il seguente messaggio di errore: "L'annotazione @XmlElement viene annullato a causa di questa posizione", è probabile che si sta utilizzando l'istruzione import sbagliata.

modificarla in:

import javax.xml.bind.annotation.XmlElement; 

Come Eclipse suggerisce un altro pacchetto come prima opzione, si tratta di un errore molto comune.