2014-07-13 7 views
11

के लिए मिला कोई वसंत एकीकरण के साथ नया हूं और मेरी परियोजना आवश्यकता के लिए वसंत एकीकरण http मॉड्यूल में काम कर रहा हूं। मैं एक HTTP क्लाइंट के रूप में आउटबाउंड गेटवे से अनुरोध भेज रहा हूं। मैं सर्वर से अनुरोध शुरू करने का प्रयास कर रहा हूं और सर्वर को मुझे मेरे सेट मानों के साथ संदेश पेलोड वापस करना चाहिए। मैं सर्वर पर भेजने के लिए ऑब्जेक्ट को JSON में परिवर्तित कर रहा हूं, मैं नीचे दिखाए गए क्लाइंट (HttpClientDemo) से सर्वर पक्ष पर मौजूद इनबाउंड गेटवे के लिए अनुरोध भेज रहा हूं। उस उद्देश्य के लिए, मैं अपनी ऑब्जेक्ट को JSON में परिवर्तित कर रहा हूं और फिर क्लाइंट पक्ष पर ऑब्जेक्ट करने के लिए JSON स्ट्रिंग में परिवर्तित कर रहा हूं, वहां कुछ सरल ऑपरेशन कर रहा हूं और उसे क्लाइंट (HttpClientDemo) पर वापस भेज रहा हूं लेकिन इससे पहले, मुझे अपवाद मिल रहा है HttpMessageConverter नीचे के रूप में:प्रतिक्रिया निकालने में असमर्थ: कोई उपयुक्त HttpMessageConverter प्रतिक्रिया प्रकार

क्लाइंट साइड कोड: HttpClientDemo.java

public class HttpClientDemo { 

    private static Logger logger = Logger.getLogger(HttpClientDemo.class); 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring/integration/http-outbound-config.xml"); 
RequestGateway requestGateway = context.getBean("requestGateway", RequestGateway.class);   
     FFSampleRequestHttp FFSampleRequesthttp = new FFSampleRequestHttp(); 
     FFSampleRequesthttp.setMyChannelID("1"); 
     FFSampleRequesthttp.setMyNumber("88"); 
     FFSampleRequesthttp.setReferenceID("9I"); 
     FFSampleRequesthttp.setTemplateType(1); 
     FFSampleRequesthttp.setTimestamp("today"); 
     FFSampleResponseHttp reply = requestGateway.FFSampleResponsegatway(FFSampleRequesthttp); 
      logger.info("Replied with: " + reply); 
    } 

} 

मेरा अनुरोध गेटवे इस प्रकार है: RequestGateway.java

Exception in thread "main" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.mycompany.MyChannel.model.FFSampleResponseHttp] and content type [text/plain;charset=UTF-8] 
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:108) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:784) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:769) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:549) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:517) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:462) 
    at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.handleRequestMessage(HttpRequestExecutingMessageHandler.java:421) 
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:170) 
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78) 
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97) 
    at org.springframework.integration.channel.AbstractSubscribablMyChannel.doSend(AbstractSubscribablMyChannel.java:77) 
    at org.springframework.integration.channel.AbstractMessagMyChannel.send(AbstractMessagMyChannel.java:255) 
    at org.springframework.integration.channel.AbstractMessagMyChannel.send(AbstractMessagMyChannel.java:223) 
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) 
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:44) 
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:93) 

कृपया नीचे संबंधित कोड की खोज

public interface RequestGateway { 


    FFSampleResponseHttp FFSampleResponsegatway(FFSampleRequestHttp request); 

} 

http-आउटबाउंड-config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:int="http://www.springframework.org/schema/integration" 
    xmlns:int-http="http://www.springframework.org/schema/integration/http" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
     http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd"> 

    <int:gateway id="requestGateway" 
       service-interface="com.mycompany.MyChannel.Common.RequestGateway" 
       default-request-channel="requestChannel"/> 

    <int:channel id="requestChannel"/> 
    <int:channel id="requestChannel1"/> 


<!-- com.mycompany.MyChannel.model.FFSampleResponseHttp --> 

    <int-http:outbound-gateway request-channel="requestChannel1" reply-channel="replyChannel1" url="http://localhost:8080/MyChannel_prj-1.0.0.BUILD-SNAPSHOT/receiveGateway" http-method="POST" extract-request-payload="true" expected-response-type="com.mycompany.MyChannel.model.FFSampleResponseHttp"/> 

    <int:object-to-json-transformer input-channel="requestChannel" output-channel="requestChannel1" content-type="application/json" result-type="STRING"/> 



    <bean id="FFSampleRequestHttp" class="com.mycompany.MyChannel.model.FFSampleRequestHttp"></bean> 


</beans> 

web.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 


<servlet> 
    <servlet-name>MyChannel-http</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet-config.xml</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>MyChannel-http</servlet-name> 
    <url-pattern>/receiveGateway</url-pattern> 
    </servlet-mapping> 


    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

</web-app> 

सर्वलेट-config.xml

<int:channel id="receivMyChannel"/> 

<int-http:inbound-gateway request-channel="receivMyChannel" path="/receiveGateway" supported-methods="POST"/> 

    <int:service-activator input-channel="receivMyChannel"> 
     <bean class="com.mycompany.MyChannel.serviceImpl.FFSampleHttpImpl"> 
     <constructor-arg ref = "FFSampleRequestHttp"></constructor-arg> 
     </bean> 
     </int:service-activator> 


    <bean id="FFSampleRequestHttp" class="com.mycompany.MyChannel.model.FFSampleRequestHttp"></bean> 
    <bean id="FFSampleResponseHttp" class="com.mycompany.MyChannel.model.FFSampleResponseHttp"></bean> 

    </beans> 



public class FFSampleHttpImpl{ 

    private static org.apache.log4j.Logger log = Logger 
      .getLogger(FFSampleImpl.class); 

    @Autowired 
    FFSampleRequestHttp request; 
    public FFSampleHttpImpl() { 
    } 

    public FFSampleHttpImpl(FFSampleRequestHttp request) { 
     super(); 
     this.request = request; 
    } 





    public String issueResponseFor(String str) throws JsonParseException, JsonMappingException, IOException { 

     ObjectMapper mapper = new ObjectMapper(); 

     FFSampleRequestHttp FFSampleRequestHttp = mapper.readValue(new String(str), FFSampleRequestHttp.class); 

     FFSampleRequestHttp.setReferenceID("Hi My Number"); 

     String strs = new String(); 

     strs = mapper.writeValueAsString(FFSampleRequestHttp); 

      return strs; 

     } 

} 

FFSampleRequestHttp.java

public class FFSampleRequestHttp { 
    protected String MyNumber; 
    protected String referenceID; 
    protected String myChannelID; 
    protected String timestamp; 
    protected int templateType; 
    public String getMyNumber() { 
     return MyNumber; 
    } 
    public void setMyNumber(String MyNumber) { 
     this.MyNumber = MyNumber; 
    } 
    public String getReferenceID() { 
     return referenceID; 
    } 
    public void setReferenceID(String referenceID) { 
     this.referenceID = referenceID; 
    } 
    public String getMyChannelID() { 
     return myChannelID; 
    } 
    public void setMyChannelID(String myChannelID) { 
     this.myChannelID = myChannelID; 
    } 
    public String getTimestamp() { 
     return timestamp; 
    } 
    public void setTimestamp(String timestamp) { 
     this.timestamp = timestamp; 
    } 
    public int getTemplateType() { 
     return templateType; 
    } 
    public void setTemplateType(int templateType) { 
     this.templateType = templateType; 
    } 
    } 

FFSampleResponseHttp.java

public class FFSampleResponseHttp { 
    protected String MyNumber; 
    protected String referenceID; 
    protected String myChannelID; 
    protected String timestamp; 
    protected int templateType; 

    public String getMyNumber() { 
     return MyNumber; 
    } 
    public void setMyNumber(String MyNumber) { 
     this.MyNumber = MyNumber; 
    } 
    public String getReferenceID() { 
     return referenceID; 
    } 
    public void setReferenceID(String referenceID) { 
     this.referenceID = referenceID; 
    } 
    public String getMyChannelID() { 
     return myChannelID; 
    } 
    public void setMyChannelID(String myChannelID) { 
     this.myChannelID = myChannelID; 
    } 
    public String getTimestamp() { 
     return timestamp; 
    } 
    public void setTimestamp(String timestamp) { 
     this.timestamp = timestamp; 
    } 
    public int getTemplateType() { 
     return templateType; 
    } 
    public void setTemplateType(int templateType) { 
     this.templateType = templateType; 
    } 
    } 

मैं त्रुटि निम्न मिल जब मैं ऊपर कोड चलाएँ:

16:55:46.843 [main] DEBUG o.s.web.client.RestTemplate - Writing [{"MyNumber":"88","referenceID":"9I","myChannelID":"1","timestamp":"today","templateType":1}] as "text/plain;charset=UTF-8" using [[email protected]31a3e2] 
16:55:46.988 [main] DEBUG o.s.web.client.RestTemplate - POST request for "http://localhost:8080/MyChannel_prj-1.0.0.BUILD-SNAPSHOT/receiveGateway" resulted in 200 (OK) 
Exception in thread "main" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.mycompany.MyChannel.model.FFSampleResponseHttp] and content type [text/plain;charset=UTF-8] 
    at org.springframework.web.client.HttpMessageConverterExtractor. 

मैं संदर्भ के लिए वसंत एकीकरण बुनियादी नमूना कोड का इस्तेमाल किया है। कृपया अपना इनपुट प्रदान करें। मैंने ट्रांसफॉर्मर ऑब्जेक्ट करने के लिए JSON के साथ कॉन्फ़िगरेशन फ़ाइलों में वसंत ऑब्जेक्ट मैपर का उपयोग करके भी कोशिश की लेकिन फिर भी मुझे HttpMessageConverter के लिए सिमलेटर समस्याएं मिल रही हैं। कृपया मुझे अपने मूल्यवान इनपुट/सुझाव के साथ मदद करें और मुझे बताएं कि क्या हमारे पास वसंत एकीकरण http ऑब्जेक्ट मैपर के साथ कोई सीमा है।


हाय आर्टेम, आपके उत्तर के लिए धन्यवाद। मुझे अभी भी नीचे वर्णित कुछ चुनौतियों का सामना करना पड़ रहा है। मैंने आपके सुझाव के अनुसार मेरी कॉन्फ़िगरेशन फ़ाइलों में बदलाव किए हैं। लेकिन Jackson2JsonObjectMapper का उपयोग करते समय समस्या का सामना करना पड़ रहा है और आपकी और सहायता की आवश्यकता है। कृपया नीचे दिए गए विवरण का पता लगाएं।

मैंने अपनी फाइलों में बदलाव किए हैं और अब फाइलें नीचे दी गई हैं: मेरा सर्वलेट-कॉन्फ़िगर।

<int:gateway id="requestGateway" service-interface="com.myCompany.myChannel.Common.RequestGateway" default-request-channel="requestChannel" /> 
    <int:channel id="requestChannel" /> 
    <int:channel id="requestChannel1" /> 
    <int:object-to-json-transformer input-channel="requestChannel" output-channel="requestChannel1" content-type="application/json" /> 
    <int-http:outbound-gateway request-channel="requestChannel1" reply-channel="channel4" url="http://localhost:8080/myChannel_prj-1.0.0.BUILD-SNAPSHOT/http/receiveGateway" http-method="POST" /> 
    <bean id="FFSampleRequestHttp" class="com.myCompany.myChannel.model.FFSampleRequestHttp" /> 
    <int:json-to-object-transformer input-channel="channel4" output-channel="requestChannel" type="com.myCompany.myChannel.model.FFSampleResponseHttp" object-mapper="jackson2JsonObjectMapper" /> 
    <bean id="jackson2JsonObjectMapper" class="org.springframework.integration.support.json.Jackson2JsonObjectMapper" /> 
    </beans> 

मेरे impl वर्ग पद्धति के रूप में नीचे है::

public FfSampleResponseHttp issueResponseFor(FfSampleRequestHttp request) { 

     FfSampleResponseHttp ffSampleResponse2 = new FfSampleResponseHttp(); 

     ffSampleResponse2.setCifNumber("Yappi I am in the method"); 
     log.info("issueResponseFor(FfSampleRequesthttp request)"); 

     return ffSampleResponse2; 

    } 
xml फ़ाइल सामग्री के रूप में नीचे है:

<int:channel id="channel1" /> 
<int:channel id="channel2" /> 
<int:channel id="channel3" /> 
<int-http:inbound-gateway request-channel="channel1" supported-methods="POST" path="/receiveGateway" /> 
- <int:service-activator input-channel="channel2"> 
- <bean class="com.myCompany.myChannel.serviceImpl.FFSampleHttpImpl"> 
<constructor-arg ref="ffSampleRequestHttp" /> 
</bean> 
</int:service-activator> 

<int:json-to-object-transformer input-channel="channel1" output-channel="channel2" type="com.myCompany.myChannel.model.FFSampleRequestHttp" object-mapper="jackson2JsonObjectMapper" /> 

<bean id="jackson2JsonObjectMapper" class="org.springframework.integration.support.json.Jackson2JsonObjectMapper" /> 
<bean id="ffSampleRequestHttp" class="com.myCompany.myChannel.model.FFSampleRequestHttp" /> 
<bean id="ffSampleResponseHttp" class="com.myCompany.myChannel.model.FFSampleResponseHttp" /> 
</beans> 

आउट बाध्य फ़ाइल config (फ़ाइल जो सर्वर के लिए भेजा संदेश के लिए जिम्मेदार है)

मैं क्लाइंट से सर्वर पक्ष में उपस्थित होने के लिए अपनी सेवा विधि समस्या को कॉल करने में सक्षम हूं लेकिन जब यह आगे संसाधित हो रहा है:

Caused by: java.lang.IllegalArgumentException: 'json' argument must be an instance of: [class java.lang.String, class [B, class java.io.File, class java.net.URL, class java.io.InputStream, class java.io.Reader] 
     at org.springframework.integration.support.json.Jackson2JsonObjectMapper.fromJson(Jackson2JsonObjectMapper.java:93) 
     at org.springframework.integration.support.json.Jackson2JsonObjectMapper.fromJson(Jackson2JsonObjectMapper.java:44) 
     at org.springframework.integration.support.json.AbstractJacksonJsonObjectMapper.fromJson(AbstractJacksonJsonObjectMapper.java:55) 
     at org.springframework.integration.json.JsonToObjectTransformer.doTransform(JsonToObjectTransformer.java:78) 
     at org.springframework.integration.transformer.AbstractTransformer.transform(AbstractTransformer.java:33) 
     ... 54 more 

मैंने डिबगिंग करते समय सत्यापित किया है कि प्रतिक्रिया में रहते हुए पेलोड बॉडी जैक्सन ऑब्जेक्ट में जैक्सन ऑब्जेक्ट में खाली हो रही है, जो मेरी सेवा विधि के माध्यम से रोमिंग के बाद जैक्सन 2 जेसन ओब्जेक्टमैपर.फॉमजसन (...) के पैरामीटर में खाली हो रही है। मैं समझ नहीं पा रहा हूं कि मैं गलती कहां कर रहा हूं। कृपया अपनी सहायता/इनपुट प्रदान करें। फिर मुझे बताएं कि क्या मैं फिर से अपनी कॉन्फ़िगरेशन फ़ाइलों में कुछ खो रहा हूं। आप के सहयोग के लिए बहुत धन्यवाद।

उत्तर

4

जब से तुम ग्राहक पर लौटने सिर्फ String और उसके content type == 'text/plain', वहाँ कोई डिफ़ॉल्ट कन्वर्टर्स के लिए कोई मौका कैसे FFSampleResponseHttp वस्तु को String प्रतिक्रिया कन्वर्ट करने के लिए निर्धारित है।

आसान तरीका यह तय करने के लिए:

  • से <int-http:outbound-gateway>
  • हटाने expected-response-typereplyChannel1<json-to-object-transformer>

करने के लिए जोड़ नहीं तो आप लिखना चाहिए अपनी खुद की HttpMessageConverter उचित वस्तु को स्ट्रिंग कन्वर्ट करने के लिए ।

यह MappingJackson2HttpMessageConverter (डिफ़ॉल्ट कन्वर्टर्स में से एक) और अपने expected-response-type के साथ काम करने के लिए आपको content type = 'application/json' साथ अपना जवाब भेजने चाहिए।

यदि आवश्यकता है, तो अपने <service-activator> के बाद और <int-http:inbound-gateway> पर उत्तर भेजने से पहले जोड़ें।

तो, यह आपके लिए चुनने का समाधान है, लेकिन आपकी वर्तमान स्थिति काम नहीं करती है, क्योंकि डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ असंगतता है।

अद्यतन

ठीक है। चूंकि आपने अपने सर्वर को FfSampleResponseHttp ऑब्जेक्ट को HTTP प्रतिक्रिया के रूप में बदलने के लिए बदल दिया है, स्ट्रिंग नहीं, HTTP के लिए प्रतिक्रिया भेजने से पहले contentType = 'application/json' शीर्षलेख जोड़ें और MappingJackson2HttpMessageConverter आपके लिए सामान करेगा - आपकी ऑब्जेक्ट JSON में परिवर्तित हो जाएगी और सही contentType शीर्षलेख के साथ।

ग्राहक पक्ष से आपको expected-response-type="com.mycompany.MyChannel.model.FFSampleResponseHttp" और MappingJackson2HttpMessageConverter पर वापस आना चाहिए आपके लिए फिर से सामान करना चाहिए।

बेशक आपको <int-http:outbound-gateway> के बाद संदेश प्रवाह से <json-to-object-transformer> हटा देना चाहिए।

+0

हाय Artem, मैं अभी भी कुछ समस्याओं का सामना कर रहा हूँ और मैं जोड़ लिया है केवल मेरी समीक्षा के लिए मेरे प्रश्न में परिवर्तन करने के बाद my servlet-config.xml और http-outbound-config.xml। परिवर्तनों को कृपया सत्यापित करें और मुझे अपना इनपुट बताएं। –

+0

आपके परिवर्तनों के अनुसार अद्यतन जोड़ा गया। –

+0

हाय आर्टम, यह मेरे लिए काम करता है :) आपकी मदद और समर्थन के लिए बहुत बहुत धन्यवाद .. :) –

-1
public class Application { 

    private static List<HttpMessageConverter<?>> getMessageConverters() { 
     List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); 
     converters.add(new MappingJacksonHttpMessageConverter()); 
     return converters; 
    } 

    public static void main(String[] args) { 
     RestTemplate restTemplate = new RestTemplate(); 

     restTemplate.setMessageConverters(getMessageConverters()); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
     HttpEntity<String> entity = new HttpEntity<String>(headers); 
     //Page page = restTemplate.getForObject("http://graph.facebook.com/pivotalsoftware", Page.class); 

     ResponseEntity<Page> response = 
        restTemplate.exchange("http://graph.facebook.com/skbh86", HttpMethod.GET, entity, Page.class, "1"); 
     Page page = response.getBody(); 
     System.out.println("Name: " + page.getId()); 
     System.out.println("About: " + page.getFirst_name()); 
     System.out.println("Phone: " + page.getLast_name()); 
     System.out.println("Website: " + page.getMiddle_name()); 
     System.out.println("Website: " + page.getName()); 
    } 
} 
+0

कोड स्वरूपित करें और आपको यह बताने की कोशिश करें कि आप क्या हैं इसे काम करने के लिए बदल गया है। – BabyDuck

4

रूप Artem बिलान ने कहा, इस समस्या occures क्योंकि MappingJackson2HttpMessageConverter आवेदन/json के साथ प्रतिक्रिया का समर्थन करता है केवल सामग्री प्रकार। आप सर्वर कोड को बदल नहीं सकते हैं, लेकिन ग्राहक कोड बदल सकते हैं (मैं इस तरह के मामले था), तो आपको इंटरसेप्टर साथ सामग्री प्रकार हेडर बदल सकते हैं:

restTemplate.getInterceptors().add((request, body, execution) -> { 
      ClientHttpResponse response = execution.execute(request,body); 
      response.getHeaders().setContentType(MediaType.APPLICATION_JSON); 
      return response; 
     }); 
संबंधित मुद्दे