web-dev-qa-db-ja.com

@WebParamの@XmlElement(required = true)が機能しない

JAX-WSを使用してWebサービスを構築しています。 _@WebParam_の注釈@XmlElement(required=true)が一部の_@WebService_クラスで機能するが、他のクラスでは機能しないという奇妙な問題があります。

2つの_@WebService_クラスに非常に似たコードがあります。この問題の原因は何ですか?パラメータタイプまたはエンティティクラス?

編集:サンプルコードを追加

私は2つの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){
...
}}
_

そして

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

2番目の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>
_

したがって、1つ目は正常に機能し、2つ目は機能しません。どのようにして可能ですか? :(

15
Shichao

_@WebParam_の後に@XmlElement(required=true,nillable=false)を追加すると、同様の問題が解決しました。 CXF2.7.9の使用。 _@XmlElement_を最初に入れてみませんでしたか?

4
john.hestad

私も同じ問題を抱えています。サービスメソッドのパラメータに別のクラスを使用することで解決策を見つけました。

例えば.

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

多分これは役立つでしょう

3

次のエラーメッセージが表示される場合: "アノテーション@XmlElementはこの場所では許可されていません"、可能性があります '間違ったインポート文を使用しています。

次のように変更します。

import javax.xml.bind.annotation.XmlElement;

Eclipseが最初のオプションとして別のパッケージを提案しているので、それは非常によくある間違いです。

2
Thiago Pasa

@WebParamと@XmlElementで順序を変更してみますか?実際に私はこれにWSを持っています:

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>

それでおしまい!!

0
jthan24

おそらく私は解決策を見つけました。誰かが同じ問題に遭遇した場合、すべての人が以前に答えたように、これらの注釈を正確にこの順序でWebサービスコントラクト(インターフェース)に配置します。

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