2011-10-23 14 views
13

JAX-WSを使用してWebサービスを構築しています。私は、@WebParamの注釈@XmlElement(required=true)がいくつかの@WebServiceクラスで動作するという奇妙な問題がありますが、他のクラスでは動作しません。@WebParamの@XmlElement(必須= true)は動作しません

私は2つの@WebServiceクラスに非常に似たコードを持っています。この問題の原因は何ですか?パラメータタイプまたはエンティティクラス?

編集:最初の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) { 
... 
}} 

<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が正常に動作し、二番目は動作しません。どのように可能ですか? :(

+0

2つのケースのコードサンプルはありますか?あなたが直面している実際の問題(例:例外、行動のより良い説明など) –

+1

私はコードを追加しました。 – Shichao

+0

私は@XmlElement GET ERRORが '注釈@XmlElementがこのlocation'例えば、'パブリックブールvalidateRegistration(@XmlElement(=真必須)@WebParam文字列devicedId'のために禁止されて追加すると、エラー – Tomer

答えて

3

は、私は同じ問題。私は、サービスメソッドのパラメータのために別のクラスの使用で解決策を発見した。

例えば

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

多分この意志help

+2

、「SampleRequestType」自体はオプションを示しています。 – NamingException

0

あなたは@WebParamと@XmlElementの順序を変更してみてください。実際にはありますか? WSの聖霊降臨祭の本:

<xsd:schema> 
<xsd:import namespace="cedulaParam" schemaLocation="http://eniacstein-pc:8080/WSDL_Sample/GestorPersonas?xsd=2"/> 
</xsd:schema> 

とスキーマ定義:

public Persona consultarPersona(@WebParam(name = "cedula") @XmlElement(required=true, nillable=false, name="cedula", namespace="cedulaParam") String cedula) 

と説明がある生成

<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

を追加すると、@WebParamは私の同様の問題を解決しました。 CXFの使用2.7.9。最初に@XmlElementを入れてみませんでしたか、それは簡単かもしれませんか?

+0

は注釈を取得 '@XmlElementは、この問題を解決する方法。このlocation'のために許可されていません。開発のためのRSAを使用する。私はCXFバージョンを更新する必要がある場合は、親切に助けMavenとバージョンのリンク – Rajesh

2

次のエラーメッセージが表示されない場合は、「注釈@XmlElementがこの場所のために許可されていない」と、チャンスはあなたが間違ってインポート文を使用しています。

変更を:Eclipseが最初のオプションとして別のパッケージを提案したよう

import javax.xml.bind.annotation.XmlElement; 

は、それは非常によくある間違いです。

関連する問題