@XmlElement(required=true) для @WebParam не работает

Я создаю веб-сервис с помощью JAX-WS. У меня странная проблема: аннотация @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) {
...
}}

Сгенерированная схема для первого веб-метода:

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

Сгенерированная схема для второго веб-метода:

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

Итак, первый работает отлично, второй не работает. Как это возможно?: (

Ответы

Ответ 1

У меня такая же проблема. Я нашел решение по использованию отдельного класса для параметров метода обслуживания.

например.

@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

Добавление @XmlElement(required=true,nillable=false) после @WebParam решило мою аналогичную проблему. Использование CXF 2.7.9. Не пытались поставить @XmlElement во-первых, может ли быть так просто?

Ответ 3

Если у вас появляется следующее сообщение об ошибке: " аннотация @XmlElement запрещена для этого местоположения), скорее всего, вы используете неправильный оператор импорта.

Измените его на:

import javax.xml.bind.annotation.XmlElement;

Поскольку Eclipse предлагает другой пакет в качестве первого варианта, это очень распространенная ошибка.

Ответ 4

Вы пытаетесь изменить порядок в @WebParam и @XmlElement? на самом деле у меня есть WS whit this:

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>

что это!!

Ответ 5

Возможно, я нашел решение. Если кто-то сталкивается с той же проблемой, просто разместите эти аннотации в контракте (интерфейсе) веб-службы в том же порядке, как и все парни, отвечавшие ранее.

@WebParam(name = "yourParam") @XmlElement(required = true)  YourParam param