我正在使用JAX-WS构建Web服务。我有一个奇怪的问题,@XmlElement(required=true)
的注释@WebParam
适用于某些@WebService
类,但在其他一些类中不起作用。
我在两个@WebService
类中有非常相似的代码。什么可能导致这个问题?参数类型还是实体类?
修改:添加示例代码
我有两个网络服务:
@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){
...
}}
和
@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) {
...
}}
第一个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>
第二个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>
所以第一个工作正常,第二个工作不起作用。这怎么可能? :(
答案 0 :(得分:4)
在@XmlElement(required=true,nillable=false)
之后添加@WebParam
解决了我的类似问题。使用CXF 2.7.9。没试过先放@XmlElement
,这可不是那么简单?
答案 1 :(得分:3)
我有同样的问题。我找到了使用单独的类作为服务方法参数的解决方案。
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;
...
网络的方法
@WebMethod
public String sampleMethod(@WebParam(name = "params") SampleRequest params) {
也许这会有所帮助
答案 2 :(得分:2)
如果您收到以下错误消息:&#34; 此地点不允许使用注释@XmlElement &#34;您可能会&#39;重新使用错误的import语句。
将其更改为:
import javax.xml.bind.annotation.XmlElement;
由于Eclipse建议将另一个软件包作为第一个选项,因此这是一个非常常见的错误。
答案 3 :(得分:0)
您尝试更改@WebParam和@XmlElement中的顺序吗?实际上我有一个WS whit:
public Persona consultarPersona(@WebParam(name = "cedula") @XmlElement(required=true, nillable=false, name="cedula", namespace="cedulaParam") String cedula)
描述生成的是:
<xsd:schema>
<xsd:import namespace="cedulaParam" schemaLocation="http://eniacstein-pc:8080/WSDL_Sample/GestorPersonas?xsd=2"/>
</xsd: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>
就是这样!!
答案 4 :(得分:0)
也许我找到了解决方案。如果有人遇到相同的问题,只需按照所有人的回答,将这些批注按照确切的顺序放在您的Web服务合同(接口)中即可。
@WebParam(name = "yourParam") @XmlElement(required = true) YourParam param