gpt4 book ai didi

spring - JSONP 与 Spring 3.0 和 Jackson

转载 作者:IT老高 更新时间:2023-10-28 13:54:33 25 4
gpt4 key购买 nike

要使用 Spring 3.0 返回 JSON 响应,只需在 @Controller 中添加 @ResponseBody 注释以及 @RequestMapping。只要加载了 MapppingJacksonJson 库并且客户端发送带有 application/json 的 Accept header ,它将起作用。

JSONP 呢?是否可以返回以及如何返回?

最佳答案

这篇博文展示了一个正确而简洁的解决方案:Implementing JSONP in Spring MVC 3.0.x

这个更适合 Spring 3.1:XML, JSON, JSON-P Web Service Endpoints in 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 );
}

}

关于spring - JSONP 与 Spring 3.0 和 Jackson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7655975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com