2011-01-07 11 views
1

こんにちは、私はここに春のWebサービスを使用して、私のXSDは、エンドポイントをここで春のWebサービス応答は、さまざまなWebサービス(Java)の

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns="http://www.test-software.co.uk/abcportal/schema/abcportaltokendetailsws" 
     targetNamespace="http://www.test-software.co.uk/abcportal/schema/abcportaltokendetailsws" 
     elementFormDefault="qualified" attributeFormDefault="unqualified"> 


     <xs:element name="abcPortalTokenDetailsRequest"> 
      <xs:complexType> 
       <xs:annotation> 
         <xs:documentation>The data structure required to get token details</xs:documentation> 
       </xs:annotation> 
       <xs:sequence> 
        <xs:element name="token" type="token3rdParty"/>     
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 

     <xs:element name="abcPortalTokenDetailsResponse"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="tokenDetails" type="TokenDetailsType" /> 
        <xs:element name="result" type="resultStructure"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 

     <xs:simpleType name="token3rdParty"> 
      <xs:restriction base="xs:token"> 
      <xs:minLength value="1"></xs:minLength> 
      <xs:maxLength value="60"></xs:maxLength> 
      <xs:pattern value="([A-Za-z0-9]+)" /> 
      </xs:restriction> 
     </xs:simpleType> 


     <xs:complexType name="TokenDetailsType"> 
      <xs:annotation> 
       <xs:documentation>token details</xs:documentation> 
      </xs:annotation> 
      <xs:sequence> 
       <xs:element name="sNumber" type="SNumberType"/> 
       <xs:element name="sId" type="SIdType"/> 
       <xs:element name="sName" type="SNameType"/>      
      </xs:sequence> 
     </xs:complexType> 

     <xs:simpleType name="SNumberType"> 
      <xs:restriction base="xs:string"> 
      <xs:minLength value="1"></xs:minLength> 
      <xs:maxLength value="60"></xs:maxLength> 
      <xs:pattern value="([A-Za-z0-9]+)" /> 
      </xs:restriction> 
     </xs:simpleType> 

     <xs:simpleType name="SIdType"> 
      <xs:restriction base="xs:string"> 
      <xs:minLength value="1"></xs:minLength> 
      <xs:maxLength value="2"></xs:maxLength> 
      <xs:pattern value="([A-Za-z]+)" /> 
      </xs:restriction> 
     </xs:simpleType>  

     <xs:simpleType name="SNameType"> 
      <xs:restriction base="xs:string"> 
      <xs:minLength value="1"></xs:minLength> 
      <xs:maxLength value="128"></xs:maxLength> 
      <xs:pattern value="([A-Za-z0-9]+)" /> 
      </xs:restriction> 
     </xs:simpleType>   

     <xs:complexType name="resultStructure"> 
      <xs:sequence> 
       <xs:element name="resultCode" minOccurs="1" maxOccurs="1"> 
        <xs:annotation> 
         <xs:documentation>The result code indicates the outcome of the available list for request.</xs:documentation> 
        </xs:annotation> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="OK"/> 
          <xs:enumeration value="INVALID"/> 
          <xs:enumeration value="ERROR"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       <xs:element name="resultMessage" minOccurs="1" maxOccurs="1"> 
        <xs:annotation> 
         <xs:documentation>The associated message for this result</xs:documentation> 
        </xs:annotation> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:maxLength value="255"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 

    </xs:schema> 

に見えるがいかにあるのですが、複数の名前空間を持っている

@Endpoint 
public class abcPortalTokenDetailsEndpoint { 

    private IabcPortalManager abcPortalManager; 

    private static final Logger logger = Logger.getLogger(abcPortalTokenDetailsEndpoint.class); 

     public void setAbcPortalManager(IabcPortalManager abcPortalManager) { 
     this.abcPortalManager = abcPortalManager; 
    } 

    @PayloadRoot(localPart= "AbcPortalTokenDetailsRequest", namespace="http://www.test-software.co.uk/abcportal/schema/abcportaltokendetailsws") 
    public abcPortalTokenDetailsResponse doit(abcPortalTokenDetailsRequest request){ 

     abcPortalTokenDetailsResponse response = new abcPortalTokenDetailsResponse();  
     // check that the token is currently valid 
     String token = request.getToken().trim();  
     String resultCode = "ERROR", resultMessage = "Internal error occured - valid response could not be generated"; 
     boolean okResult = true, valid = false;   
     TAuth tp = null; 
     Integer sId = 0; 
     String sName = ""; 
     String errorMsg = null; 

     try { 
      //validate token    
      if (token != null) {     
       resultCode = "OK"; 
       resultMessage = "Valid session"; 
      } else { 
       resultCode = "INVALID"; 
       resultMessage = "No record of user being logged in"; 
       okResult = false; 
      } 

     } catch (DataAccessException ex) {    
      String fmtStr = "Could not determine whether end user token (%s) is valid.\n %s"; 
      String errMsg = String.format(fmtStr, token, ex.getMessage()); 
      okResult = false; 
      logger.error(errMsg);   
      assert(false) : errMsg; 
     } 

     if(okResult){ 
      if(logger.isDebugEnabled()){ 
       logger.debug("abcPortalTokenDetailsResponse Authenticate user"); 
      } 
      tp = abcPortalManager.getTpAuth(token); 

      if(logger.isDebugEnabled()){ 
       if(tp != null){ 

        if (tp.getSId()!= null){ 
        sName = "ct"; abcPortalManager.getSName(tp.getSId()); 
        }    
       } else { 
        logger.debug("abcPortalTokenDetailsResponse tparty details not found"); 
       } 
      } 
      valid = true; 
     } 


     TokenDetailsType tokenDetailsPart = constructResponseTokenDetailsPart(valid, okResult, tp, sName); 
     response.setTokenDetails(tokenDetailsPart); 

     ResultStructure resultPart = constructResponseResultPart(valid, okResult, errorMsg); 
     response.setResult(resultPart); 

     return response; 
    } 




    private TokenDetailsType constructResponseTokenDetailsPart(
      boolean valid, boolean okResult, TAuth tp,String sName) { 

     TokenDetailsType tdt = null; 


     if (valid && okResult) { 

      tdt = new TokenDetailsType();  
      tdt.setSId(tp.getSId()); 
      tdt.setSNumber(tp.getSNumber); 
      tdt.setSName(sName);      

     } 

     return tdt; 

    } 

    /** 
    * 
    * @param response 
    * @param okResult 
    * void 
    * 
    */ 
    private ResultStructure constructResponseResultPart(
      boolean valid, boolean okResult, String errorMessage) { 

     // Determine result part of response 
     String resultCode, resultMessage; 
     if (okResult) { 
      resultCode = (valid) ? "OK" : "INVALID"; 
      resultMessage = (valid) ? "Successfull query" : "User not authorised";   
     } else { 
      resultCode = "ERROR"; 
      resultMessage = "Valid response could not be generated: " + errorMessage; 
     } 
     ResultStructure resp_result = new ResultStructure(); 
     resp_result.setResultCode(resultCode); 
     resp_result.setResultMessage(resultMessage); 

     return resp_result;  

    } 



} 

とき、私SoapUIを使用してWebサービスをテストしようとすると、なぜ私のプロジェクト内の異なるWebサービスの複数の名前空間があるのですか?私はただabcportaltokendetailswsとabcportalloginstatusws、abcportallogoutwsのような他のサービスを期待してなぜこれが表示されますか?

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns10:abcPortalTokenDetailsResponse 
xmlns:ns10="http://www.test-software.co.uk/abcportal/schema/abcportaltokendetailsws" 
xmlns:ns2="http://www.test-software.co.uk/abcportal/schema/abcportalloginstatusws" xmlns:ns4="http://www.test-software.co.uk/abcportal/schema/abcportallpaymentws" xmlns:ns5="http://www.test-software.co.uk/abcportal/schema/abcportallogoutws" xmlns:ns6="http://www.test-software.co.uk/abcportal/schema/abcportalfundservicews" xmlns:ns7="http://www.test-software.co.uk/abcportal/schema/abcportalpayservicews" 
     <ns10:tokenDetails> 
      <ns10:sNumber>43454</ns10:sNumber> 
      <ns10:sId/> 
      <ns10:sName>Bridge Market</ns10:sName> 
     </ns10:tokenDetails> 
     <ns10:result> 
      <ns10:resultCode>OK</ns10:resultCode> 
      <ns10:resultMessage>Successfull query</ns10:resultMessage> 
     </ns10:result> 
     </ns10:abcPortalTokenDetailsResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

問題ではありません。はい、それは不安定ですが、それでも有効です。 – skaffman

+0

含まれないようにする方法。また、もし私が20のwsを持っているなら、それはすべての名前空間が意味を成さないでしょう。 – Gauls

答えて

0

これはabcPortalTokenDetailsEndpointはMarshallingMethodEndpointAdapterを拡張することができ、ばね-WS 1.5.9と共にスプリング2.5を使用して回避することができます。また、configファイルには、各エンドポイントごとに異なるbeanidマーシャラがある場合は正常に動作します。私もSpring 3.0とSpring-ws 1.5.9で同じことを試しました。正式にはサポートされていません。複数のbeanid marshallerで動作しません。bean idに単語marshallerが必要ですか? 例 全体の問題は、とのcontextPathを使用している「:」または「リスト」(これが応答ですべてな名前空間を追加します)

<oxm:jaxb2-marshaller id="marshaller" contextPath="com.abc.web.ws.login.status.schema:com.abc.web.ws.profile.schema:com.abc.web.ws.tokendetails.schema> 

を私たちは、次のように上記のコードを変更した場合、それは春の2.5.6で動作します3.0なぜ春ですか?

<bean id="abcPortalTokenDetailsEndpoint" class="com.abc.web.ws.tokendetails.abcPortalTokenDetailsEndpoint"> 

     <property name="marshaller" ref="marshaller1"/> 
     <property name="unmarshaller" ref="marshaller1"/> 
    </bean> 

<bean id="abcPortalTrustedAccessLogInEndpoint" class="com.abc.web.ws.login.trustedaccess.abcPortalTrustedAccessLogInEndpoint">  

     <property name="marshaller" ref="marshaller2"/> 
     <property name="unmarshaller" ref="marshaller2"/> 
</bean> 

<bean id="abcPortalThirdPartyLogInEndpoint" class="com.abc.web.ws.login.thirdparty.abcPortalThirdPartyLogInEndpoint"> 

     <property name="marshaller" ref="marshaller"/> 
     <property name="unmarshaller" ref="marshaller"/> 
    </bean> 

    <bean id="marshaller1" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="contextPath" value="com.abc.web.ws.tokendetails.schema"/>      
     </bean> 

     <bean id="marshaller2" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="contextPath" value="com.abc.web.ws.login.trustedaccess.schema"/>      
     </bean> 

     <bean id="marshaller3" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">   
      <property name="contextPath" value="com.abc.web.ws.login.thirdparty.schema"/>  
     </bean> 









public class abcPortalTokenDetailsEndpoint extends MarshallingMethodEndpointAdapter{ 

    private IabcPortalManager abcPortalManager; 

    private static final Logger logger = Logger.getLogger(abcPortalTokenDetailsEndpoint.class); 

     public void setAbcPortalManager(IabcPortalManager abcPortalManager) { 
     this.abcPortalManager = abcPortalManager; 
    } 




    public abcPortalTokenDetailsResponse handleabcPortalTokenDetailsRequest(abcPortalTokenDetailsRequest request){ 



abcPortalTokenDetailsResponse response = new abcPortalTokenDetailsResponse();  
     // check that the token is currently valid 
     String token = request.getToken().trim();  
     String resultCode = "ERROR", resultMessage = "Internal error occured - valid response could not be generated"; 
     boolean okResult = true, valid = false;   
     TAuth tp = null; 
     Integer sId = 0; 
     String sName = ""; 
     String errorMsg = null; 

     try { 
      //validate token    
      if (token != null) {     
       resultCode = "OK"; 
       resultMessage = "Valid session"; 
      } else { 
       resultCode = "INVALID"; 
       resultMessage = "No record of user being logged in"; 
       okResult = false; 
      } 

     } catch (DataAccessException ex) {    
      String fmtStr = "Could not determine whether end user token (%s) is valid.\n %s"; 
      String errMsg = String.format(fmtStr, token, ex.getMessage()); 
      okResult = false; 
      logger.error(errMsg);   
      assert(false) : errMsg; 
     } 

     if(okResult){ 
      if(logger.isDebugEnabled()){ 
       logger.debug("abcPortalTokenDetailsResponse Authenticate user"); 
      } 
      tp = abcPortalManager.getTpAuth(token); 

      if(logger.isDebugEnabled()){ 
       if(tp != null){ 

        if (tp.getSId()!= null){ 
        sName = "ct"; abcPortalManager.getSName(tp.getSId()); 
        }    
       } else { 
        logger.debug("abcPortalTokenDetailsResponse tparty details not found"); 
       } 
      } 
      valid = true; 
     } 


     TokenDetailsType tokenDetailsPart = constructResponseTokenDetailsPart(valid, okResult, tp, sName); 
     response.setTokenDetails(tokenDetailsPart); 

     ResultStructure resultPart = constructResponseResultPart(valid, okResult, errorMsg); 
     response.setResult(resultPart); 

     return response; 
    } 
+0

は、Spring3.0.0.3とSpring-ws 2.5.9でうまく動作します。 – Gauls

0

個別のマーシャラーを持つ必要はありません。あなたのEndpointResponseメソッドを@ResponsePayloadとすることで解決できます。 例:

@PayloadRoot(localPart= "AbcPortalTokenDetailsRequest", namespace="http://www.test-software.co.uk/abcportal/schema/abcportaltokendetailsws") 
@ResponsePayload 

public abcPortalTokenDetailsResponse doit(abcPortalTokenDetailsRequest request){ 
関連する問題