... यह जवाब खोजने के लिए इतनी मेहनत था और मैं तो पालन किया था: के बाद से 3.1 वर्तमान में केवल एक मील का पत्थर रिहाई (एम 1) है, मैं इसे बनाने के बाद अपने कनवर्टर इस तरह से दर्ज की सुझाव देंगे अपूर्ण जानकारी के लिए कई संकेत जो मुझे लगता है कि यहां पूरा जवाब पोस्ट करना अच्छा होगा। तो अगले के लिए यह खोजना आसान होगा।
package net.iogui.web.spring.converter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
public class GsonHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
private Gson gson = new Gson();
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
public GsonHttpMessageConverter(){
super(new MediaType("application", "json", DEFAULT_CHARSET));
}
@Override
protected Object readInternal(Class<? extends Object> clazz,
HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
try{
return gson.fromJson(convertStreamToString(inputMessage.getBody()), clazz);
}catch(JsonSyntaxException e){
throw new HttpMessageNotReadableException("Could not read JSON: " + e.getMessage(), e);
}
}
@Override
protected boolean supports(Class<?> clazz) {
return true;
}
@Override
protected void writeInternal(Object t,
HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//TODO: adapt this to be able to receive a list of json objects too
String json = gson.toJson(t);
outputMessage.getBody().write(json.getBytes());
}
//TODO: move this to a more appropriated utils class
public String convertStreamToString(InputStream is) throws IOException {
/*
* To convert the InputStream to String we use the Reader.read(char[]
* buffer) method. We iterate until the Reader return -1 which means
* there's no more data to read. We use the StringWriter class to
* produce the string.
*/
if (is != null) {
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
}
}
}
तब मैं annnotaion संचालित टैग पर पट्टी और वसंत-MVC विन्यास फाइल पर अपने ही हाथों से सभी को कॉन्फ़िगर करने के लिए किया था:
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Configures the @Controller programming model -->
<!-- To use just with a JSR-303 provider in the classpath
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="net.iogui.web.spring.util.CommonWebBindingInitializer" />
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<bean class="net.iogui.web.spring.converter.GsonHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<!-- bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /-->
</list>
</property>
</bean>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<context:component-scan base-package="net.iogui.teste.web.controller"/>
<!-- Forwards requests to the "/" resource to the "login" view -->
<mvc:view-controller path="/" view-name="home"/>
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
सबसे पहले मैं कस्टम HttpMessageConverter को लागू करने के लिए किया था
कि, Formater और सत्यापनकर्ता काम करने के लिए बनाने के लिए देखें, हम एक कस्टम बनाने की कोई आवश्यकता webBindingInitializer भी:
package net.iogui.web.spring.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;
public class CommonWebBindingInitializer implements WebBindingInitializer {
@Autowired(required=false)
private Validator validator;
@Autowired
private ConversionService conversionService;
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.setValidator(validator);
binder.setConversionService(conversionService);
}
}
एक दिलचस्प बात यह देखने के लिए आदेश annotaion चालित टैग के बिना विन्यास काम करने के लिए, हम स्वयं एक AnnotationMethodHandlerAdapter और एक DefaultAnnotationHandlerMapping कॉन्फ़िगर करने के लिए होता है।और व्यवस्था AnnotationMethodHandlerAdapter स्वरूपण और मान्यता से निपटने में सक्षम बनाने के लिए में, हम एक सत्यापनकर्ता, एक conversionService कॉन्फ़िगर करने के लिए और एक कस्टम webBindingInitializer का निर्माण करने के लिए किया था।
मुझे आशा है कि यह सब मेरे अलावा किसी और की मदद करेगा।
मेरी बेताब खोज पर, this @ बोझो पोस्ट बेहद उपयोग था। मैं @GaryF couse का भी आभारी हूं कि उसका जवाब मुझे @Bozho post पर ले गया। आप जो स्प्रिंग 3.1 में ऐसा करने की कोशिश कर रहे हैं, आप @ रॉबी तालाब जवाब देखें .. बहुत आसान है, है ना?
धन्यवाद, मैं मैं जैक्सन के साथ ठीक हूँ, हालांकि मैं सोच रहा था कि मैं जीसन के साथ ऐसा कैसे करूंगा। बीटीडब्ल्यू, आप इनपुटस्ट्रीम से स्ट्रिंग प्राप्त करने के लिए अपाचे कॉमन्स IOUtils का उपयोग कर सकते थे। मैं आमतौर पर जहां संभव हो वहां तीसरे पक्ष के पुस्तकालयों का उपयोग करना पसंद करता हूं क्योंकि एक तेज़/बेहतर विकल्प आने पर मुझे कोड को बेहतर बनाने की आवश्यकता नहीं होती है, मैं बस मैवेन में संस्करण बदलता हूं :)। – Stef
यह देखते हुए कि 'AnnotationMethodHandlerAdapter' अब बहिष्कृत है, क्या यह वही कॉन्फ़िगरेशन' RequestMappingHandlerAdapter' के साथ काम करता है? – Stewart