带Spring3.0和Jackson的JSONP
使用Spring 3.0返回JSON响应就足以在带Spring3.0和Jackson的JSONP,spring,spring-mvc,jsonp,jackson,Spring,Spring Mvc,Jsonp,Jackson,使用Spring 3.0返回JSON响应就足以在@Controller中添加@ResponseBody注释以及@RequestMapping。如果MapppingJacksonJson库已加载,并且客户端发送带有application/json的Accept头,则该库将正常工作 那么JSONP呢?是否有可能返回它以及如何返回?这篇博客文章展示了一个正确而紧凑的解决方案: 对于Spring 3.1,此选项更有效: 对于Spring 3.2,这里有一个基于Jackson2的JSONP转换器: imp
@Controller
中添加@ResponseBody
注释以及@RequestMapping
。如果MapppingJacksonJson库已加载,并且客户端发送带有application/json
的Accept头,则该库将正常工作
那么JSONP呢?是否有可能返回它以及如何返回?这篇博客文章展示了一个正确而紧凑的解决方案: 对于Spring 3.1,此选项更有效: 对于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);
}
}
}
要添加它,请将此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 );
}
}
import java.util.List;
导入org.springframework.http.MediaType;
导入org.springframework.http.converter.HttpMessageConverter;
导入org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
导入org.springframework.web.servlet.config.annotation.WebMVCConfigureAdapter;
导入com.google.common.collect.list;
公共类MyWebMVCConfiguer扩展了WebMVCConfigureAdapter{
@凌驾
public void configureMessageConverters(列表我正在寻找一种更简单的面向对象的JSONP方法(JSONP/CORS应该是内置的IMO…不需要任何自定义代码)…从未找到任何…但在与Spring团队联系后,结果发现,和内置的SupportCOR将在以后跟进。因为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;
}
}
您可以通过添加jsonGenerator.writeRaw(“/**/”)来缓解此问题;此行正上方:jsonGenerator.writeRaw(jsonPadding);您可以将writeInternal覆盖为:受保护的void writeInternal(对象对象,HttpOutputMessage outputMessage){MappingJacksonValue mjv=new MappingJacksonValue(对象);mjv.setJsonpFunction(“callback”);super.writeInternal(mjv,outputMessage);}@mickeymoon:只有在使用Spring 4.1时才可以。我的答案是Spring 3.2。请看Jeremy Grelle在上的答案。这里是。在传递到JSONP映射之前,我必须完成所有服务,我遵循了“另一个教程”,这是一个无脑的一步一步的握着,而且大部分都是有效的。唯一的问题是回调参数缺乏卫生,但我会处理的。谢谢!@stivlo你能分享你的解决方案吗?你使用的“另一个教程”是什么?@user1647708在上面的答案中有两个链接,一个叫做“此博客帖子”,另一个是“另一个教程”。第二个链接已失效。。。