2016-12-06 7 views
0

Activatorからint-http:outbound-gatewayにオブジェクトまたはjsonを渡す方法。Springインテグレーションでint-http:outbound-gatewayを使用してオブジェクト/ jsonメソッドをポストする方法

以下

<int:channel id="preparedData"/> 
    <int:service-activator input-channel="preparedData" ref="writer" method="writeData" output-channel="CallbackChannel">  
    </int:service-activator> 

    <int:channel id="CallbackChannel" /> 
    <int-http:outbound-gateway 
     request-channel="CallbackChannel" 
     http-method="POST" url="{url}" 
     extract-request-payload="true">  
     <int-http:uri-variable name="url" expression="headers['url']" />   
    </int-http:outbound-gateway> 

私のconfigsであり、私の活性化剤は上記の設定は、エラーの下に取得して@RequestBody

に一方のコントローラでPOST APIで期待されている1つのオブジェクトを返しています。

13:58:41.202 [task-scheduler-1] ERROR org.springframework.integration.handler.LoggingHandler - org.springframework.messaging.MessageHandlingException: HTTP request execution failed for URI [http://**myUrl**]; nested exception is org.springframework.web.client.HttpClientErrorException: 400 Bad Request

親切に示唆しています。

EDIT1

私はアクティベーターでJSON形式で私の返されたMyObjectに変換していた場合、私は、エラーの下に取得しています。

nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map

編集2

I「が入力」などのキーと値のペアの1でマップとオブジェクトのために私のアクティベーターの私のreturntypeにを変更した場合、それは以下のように文句を言います。

答えて

0

以下は私の解決策です。

<int:channel id="preparedData"/> 
    <int:service-activator input-channel="preparedData" ref="writer" method="writeData" output-channel="CallbackChannel"/> 

     <int:channel id="CallbackChannel"/>  
     <int:transformer input-channel="CallbackChannel" 
        output-channel="registrationQueue" 
        ref="transformer" method="doTransform"/> 

     <int:channel id="registrationQueue" /> 
     <int:header-enricher input-channel="registrationQueue" output-channel="enricherOutput"> 
      <int:header name="contentType" value="application/json"/> 
     </int:header-enricher> 

     <int:channel id="enricherOutput" /> 
     <int-http:outbound-gateway 
       request-channel="enricherOutput" 
       http-method="POST" url="{url}" 
       extract-request-payload="true" 
       reply-channel="replyChannel" 
       message-converters="converter" 
      <int-http:uri-variable name="url" expression="headers['url']" /> 
     </int-http:outbound-gateway> 

     <util:list id="converter"> 
      <bean id="test" class="com.xx.rr.ttt.MyMessageConvertor" /> 
     </util:list> 

<int:channel id="replyChannel" />  
    <int:service-activator input-channel="replyChannel" ref="lastActivator"/> 

以下のコードでコンバーターを追加する必要がありました。

public class MyMessageConvertor extends AbstractHttpMessageConverter<MyMessageConvertor> { 

    public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); 


    public MyMessageConvertor() { 
     this(DEFAULT_CHARSET); 
    } 

    public MyMessageConvertor(Charset defaultCharset) { 
     super(defaultCharset, new MediaType("application", "json"), MediaType.ALL);  

    } 

    @Override 
    protected boolean supports(Class<?> clazz) {  
     return true; 
    } 

    @Override 
    protected MyResponse readInternal(Class<? extends MyResponse > clazz, 
      HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 

     return null;   
    } 

    @Override 
    protected void writeInternal(MyResponse t, HttpOutputMessage outputMessage) 
      throws IOException, HttpMessageNotWritableException { 

     ObjectMapper mapperObj = new ObjectMapper(); 
      String jsonStr = null; 
      try { 
       jsonStr = mapperObj.writeValueAsString(t); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); 
     StreamUtils.copy(jsonStr, charset, outputMessage.getBody()); 
     //System.out.println("outputMessage.getBody()" + outputMessage.getBody());  
    } 

    private Charset getContentTypeCharset(MediaType contentType) { 
     if (contentType != null && contentType.getCharset() != null) { 
      return contentType.getCharset(); 
     } 
     else { 
      return getDefaultCharset(); 
     } 
    } 
} 

私は当たっていたURLがhttp:outbound-gatewayreply-channelが、何も返していませんが、私は1を追加し、流れを仕上げているもう一つのアクチベーターを追加する必要がありましたthtswhy必須属性であるので、私はreadInternalを実装していませんでした。

1

<int-http:outbound-gateway>代表者

HTTP request execution failed for URI [http://MYURL]; nested exception is java.lang.ClassCastException: com.******.MyObject cannot be cast to java.lang.StringデフォルトでHttpMessageConverter秒のこのセットが付属していRestTemplateにすべてのハードワーク、:

this.messageConverters.add(new ByteArrayHttpMessageConverter()); 
    this.messageConverters.add(new StringHttpMessageConverter()); 
    this.messageConverters.add(new ResourceHttpMessageConverter()); 
    this.messageConverters.add(new SourceHttpMessageConverter<>()); 
    this.messageConverters.add(new AllEncompassingFormHttpMessageConverter()); 

    if (romePresent) { 
     this.messageConverters.add(new AtomFeedHttpMessageConverter()); 
     this.messageConverters.add(new RssChannelHttpMessageConverter()); 
    } 

    if (jackson2XmlPresent) { 
     this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter()); 
    } 
    else if (jaxb2Present) { 
     this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); 
    } 

    if (jackson2Present) { 
     this.messageConverters.add(new MappingJackson2HttpMessageConverter()); 
    } 
    else if (gsonPresent) { 
     this.messageConverters.add(new GsonHttpMessageConverter()); 
    } 

    if (jackson2SmilePresent) { 
     this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter()); 
    } 
    if (jackson2CborPresent) { 
     this.messageConverters.add(new MappingJackson2CborHttpMessageConverter()); 
    } 

は、私が思うあなたの Objectワイヤバイトに何とか変換され、適切で適切な変換が使用されていることを確認するだけです。そして、それは実際にサーバー( @RequestBody)の要件に依存します。

関連する問題