问题
I'm building web service using JAX-WS. I have a strange problem that the annotation @XmlElement(required=true) for @WebParam works in some @WebService class, but doesn't work in some others.
I have very similar code in the two @WebService classes. What may cause this problem? Parameter type or the entity class?
Edit: Add sample code
I have two web services:
@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){
...
}}
and
@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) {
...
}}
The generated schema for the first web method is:
<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>
The generated schema for the second web method is:
<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>
So the first one works fine, the second one does not work. How is it possible? :(
回答1:
I have same problem. I found solution in using of separate class for parameters of service method.
e.g.
@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-method
@WebMethod
public String sampleMethod(@WebParam(name = "params") SampleRequest params) {
maybe this will help
回答2:
Adding @XmlElement(required=true,nillable=false) after @WebParam solved my similar problem. Using CXF 2.7.9. Did not try putting @XmlElement first, could it be that simple?
回答3:
If you are having the following error message: "The annotation @XmlElement is disallowed for this location", chances are you're using the wrong import statement.
Change it to:
import javax.xml.bind.annotation.XmlElement;
As Eclipse suggests another package as the first option, it's a very common mistake.
回答4:
You try change the order in @WebParam and @XmlElement? actually i have a WS whit this:
public Persona consultarPersona(@WebParam(name = "cedula") @XmlElement(required=true, nillable=false, name="cedula", namespace="cedulaParam") String cedula)
And the description generate is:
<xsd:schema>
<xsd:import namespace="cedulaParam" schemaLocation="http://eniacstein-pc:8080/WSDL_Sample/GestorPersonas?xsd=2"/>
</xsd:schema>
and the schema definition:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="cedulaParam">
<xs:element name="cedula" type="xs:string"/>
</xs:schema>
that's it!!
回答5:
Perhaps I found the solution. If anyone encounters the same problem, just place these annotations in you web service contract(interface) in exact this order, as all guys answered before.
@WebParam(name = "yourParam") @XmlElement(required = true) YourParam param
来源:https://stackoverflow.com/questions/7869494/xmlelementrequired-true-for-webparam-does-not-work