0

REST サービスにリンクされた HTTP エンドポイントを公開する単純なフローを作成しました。REST サービスは文字列を返します。この文字列は、リクエスト/レスポンス パターンを使用して JMS キューに配置されます。アイデアは、キューに配置された文字列が一部の消費者によって消費され、返信先アドレスを使用して応答が作成されるというものです。したがって、基本的にこれは同期 JMS を実装しています。

HTTP エンドポイントが基本認証を使用して保護されている場合を除いて、フローは期待どおりに機能します。この場合の応答は次のとおりです。

java.io.NotSerializableException: com.sun.jersey.spi.container.ContainerResponse (org.apache.commons.lang.SerializationException). Message payload is of type: MuleResponseWriter$1

メッセージはキューに入れられません。基本認証を削除すると、例外がスローされなくなります。また、JMS アウトバウンド エンドポイントを削除すると、文字列がエコー バックされるため、JMS エンドポイントに問題があると思われます。フロー内のコンポーネントを一方向に設定すると問題が解消されるため、問題は JMS エンドポイントからの応答にあると思われます。問題は、エンドポイントが認証資格情報なしで HTTP エンドポイントに何らかの応答を送信していて、それが原因で失敗した可能性があると思いますが、これに対処する方法がわかりません。

以下は、私が作成したフローです。

<mule
    xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting"
    xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:jms="http://www.mulesoft.org/schema/mule/jms"
    xmlns:jersey="http://www.mulesoft.org/schema/mule/jersey"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" xmlns:core="http://www.mulesoft.org/schema/mule/core"
    version="CE-3.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mule-ss="http://www.mulesoft.org/schema/mule/spring-security"
    xmlns:json="http://www.mulesoft.org/schema/mule/json"
    xmlns:ss="http://www.springframework.org/schema/security" xsi:schemaLocation="
    http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
    http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd 
    http://www.mulesoft.org/schema/mule/jersey http://www.mulesoft.org/schema/mule/jersey/current/mule-jersey.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
    http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
    http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd 
    http://www.mulesoft.org/schema/mule/spring-security http://www.mulesoft.org/schema/mule/spring-security/3.1/mule-spring-security.xsd 
    http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd ">
<jms:activemq-connector name="Active_MQ" specification="1.1" brokerURL="tcp://localhost:61616"
                        validateConnections="true" doc:name="Active MQ"/>
<mule-ss:security-manager>
    <mule-ss:delegate-security-provider name="memory-provider" delegate-ref="authenticationManager"/>
</mule-ss:security-manager>
<spring:beans>
    <ss:authentication-manager alias="authenticationManager">
        <ss:authentication-provider>
            <ss:user-service id="userService">
                <ss:user name="username" password="password" authorities="ROLE_ADMIN"/>
            </ss:user-service>
        </ss:authentication-provider>
    </ss:authentication-manager>
</spring:beans>
<flow name="RESTAPISync" doc:name="RESTAPISync">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP">
        <mule-ss:http-security-filter realm="realm"/>
    </http:inbound-endpoint>
    <jersey:resources doc:name="REST">
        <component class="SFREST"/>
    </jersey:resources>
    <jms:outbound-endpoint exchange-pattern="request-response" queue="tmp" connector-ref="Active_MQ"
                           doc:name="JMS"/>
</flow>

SFREST.java コンポーネント:

import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/pops")
public class SFREST{

    @GET
    public String getPOPs()  throws Exception{
        return "hello";
    }

}

そして例外:

ERROR 2012-11-04 21:40:57,485 [[jmstest].connector.http.mule.default.receiver.02] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message               : Authentication Attempt Failed. Message payload is of type: String
Code                  : MULE_ERROR-54999
--------------------------------------------------------------------------------
Exception stack is:
1. Bad credentials (org.springframework.security.authentication.BadCredentialsException)
    org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider:137 (null)
2. Authentication Attempt Failed. Message payload is of type: String (org.mule.api.security.UnauthorisedException)
org.mule.security.MuleSecurityManager:96 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/security/UnauthorisedException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.springframework.security.authentication.BadCredentialsException: Bad credentials
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:137)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
at org.mule.module.spring.security.SpringProviderAdapter.authenticate(SpringProviderAdapter.java:70)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

ERROR 2012-11-04 21:41:04,522 [[jmstest].connector.http.mule.default.receiver.02] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message               : java.io.NotSerializableException: com.sun.jersey.spi.container.ContainerResponse (org.apache.commons.lang.SerializationException). Message payload is of type: MuleResponseWriter$1
Code                  : MULE_ERROR-29999
--------------------------------------------------------------------------------
Exception stack is:
1. com.sun.jersey.spi.container.ContainerResponse (java.io.NotSerializableException)
java.io.ObjectOutputStream:1164 (null)
2. java.io.NotSerializableException: com.sun.jersey.spi.container.ContainerResponse (org.apache.commons.lang.SerializationException)
org.apache.commons.lang.SerializationUtils:111 (null)
3. java.io.NotSerializableException: com.sun.jersey.spi.container.ContainerResponse (org.apache.commons.lang.SerializationException). Message payload is of type: MuleResponseWriter$1 (org.mule.api.MessagingException)
org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:35 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.io.NotSerializableException: com.sun.jersey.spi.container.ContainerResponse
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at org.apache.commons.collections.map.AbstractHashedMap.doWriteObject(AbstractHashedMap.java:1182)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

何か案は?

4

2 に答える 2

1

問題は、 jersey_response プロパティをシリアル化できず、削除する必要があることでした。したがって、このプロパティがメッセージ内にある限り、ペイロードが何であるかに関係なく、メッセージは JMS アウトバウンド コンポーネントに渡されません。詳細については、次を参照してください。

http://forum.mulesoft.org/mulesoft/topics/http_authentication_with_jms_request_response?utm_content=topic_link&utm_medium=email&utm_source=reply_notification

于 2012-11-11T09:35:15.623 に答える
0

例外の理由は、任意の jersey コンポーネントが com.sun.jersey.spi.container.ContainerResponse を返すためです。ここで説明するように、次のメッセージ プロセッサに伝達する前に変換する必要があります。

于 2012-11-04T23:34:17.960 に答える