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? :(
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?
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
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.
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!!