web-dev-qa-db-fra.com

@XmlElement (required = true) pour @WebParam ne fonctionne pas

Je crée un service Web à l'aide de JAX-WS. J'ai un problème étrange que l'annotation @XmlElement(required=true) pour @WebParam fonctionne dans une classe @WebService, mais ne fonctionne pas dans d'autres.

J'ai un code très similaire dans les deux classes @WebService. Qu'est-ce qui peut causer ce problème? Type de paramètre ou classe d'entité?

Edit: Ajouter un exemple de code

J'ai deux services 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){
...
}}

et

@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) {
...
}}

Le schéma généré pour la première méthode Web est:

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

Le schéma généré pour la deuxième méthode Web est:

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

Donc, le premier fonctionne bien, le second ne fonctionne pas. Comment est-ce possible? :(

15
Shichao

Ajouter @XmlElement(required=true,nillable=false) après @WebParam a résolu mon problème similaire. Utiliser CXF 2.7.9. N'a pas essayé de mettre @XmlElement en premier, cela pourrait-il être aussi simple?

4
john.hestad

J'ai le même problème. J'ai trouvé une solution en utilisant une classe séparée pour les paramètres de la méthode de service. 

par exemple.

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

méthode web

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

peut-être que ça va aider

3
Alex Bezverkhniy

Si le message d'erreur suivant s'affiche: " L'annotation @XmlElement n'est pas autorisée pour cet emplacement ", il est probable que vous utilisiez la mauvaise instruction d'importation. 

Changez le en:

import javax.xml.bind.annotation.XmlElement;

Comme Eclipse suggère un autre package comme première option, c'est une erreur très courante.

2
Thiago Pasa

Vous essayez de changer l'ordre dans @WebParam et @XmlElement? en fait j'ai un whit wh ceci:

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

Et la description générée est:

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

et la définition du schéma:

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

c'est tout!!

0
jthan24