Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带Spring3.0和Jackson的JSONP_Spring_Spring Mvc_Jsonp_Jackson - Fatal编程技术网

带Spring3.0和Jackson的JSONP

带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

使用Spring 3.0返回JSON响应就足以在
@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在上面的答案中有两个链接,一个叫做“此博客帖子”,另一个是“另一个教程”。第二个链接已失效。。。