sti*_*vlo 14 spring jsonp spring-mvc jackson
使用Spring 3.0返回JSON响应足以@ResponseBody
在@RequestMapping
内部添加注释a @Controller
.如果加载了MapppingJacksonJson库并且客户端发送了Accept标头application/json
,则它将起作用.
JSONP怎么样?是否可以退货以及如何退货?
Aar*_*lla 12
这篇博文显示了一个正确而紧凑的解决方案:在Spring MVC 3.0.x中实现JSONP
这个适用于Spring 3.1:Spring 3.1中的XML,JSON,JSON-P Web服务端点
对于Spring 3.2,这是一个基于Jackson2的JSONP转换器:
import java.io.IOException;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
public class MappingJackson2JsonpHttpMessageConverter
extends MappingJackson2HttpMessageConverter {
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
JsonGenerator jsonGenerator = this.getObjectMapper().getFactory().createJsonGenerator(outputMessage.getBody(), encoding);
try {
String jsonPadding = "callback";
// If the callback doesn't provide, use the default callback
if (object instanceof IJsonpObject) {
String jsonCallback = ((IJsonpObject)object).getJsonCallback();
if (jsonCallback != null) {
jsonPadding = jsonCallback;
}
}
jsonGenerator.writeRaw(jsonPadding);
jsonGenerator.writeRaw('(');
this.getObjectMapper().writeValue(jsonGenerator, object);
jsonGenerator.writeRaw(");");
jsonGenerator.flush();
} catch (JsonProcessingException ex) {
throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
要添加它,请将此bean放在您的配置中:
import java.util.List;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.google.common.collect.Lists;
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters( List<HttpMessageConverter<?>> converters ) {
MappingJackson2JsonpHttpMessageConverter converter = new MappingJackson2JsonpHttpMessageConverter();
converter.setSupportedMediaTypes( Lists.newArrayList(
new MediaType( "application", "x-javascript" ),
new MediaType( "application", "javascript" ),
new MediaType( "text", "javascript" )
) );
converters.add( converter );
}
}
Run Code Online (Sandbox Code Playgroud)
Max*_*kov 12
既然Spring 4.1
你可以这样轻松地做到这一点:
@RestController
public class MyController {
@RequestMapping("/endpoint")
MappingJacksonValue getData(@RequestParam String callback) {
MappingJacksonValue value = new MappingJacksonValue(new MyPojo());
value.setJsonpFunction(callback);
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16660 次 |
最近记录: |