JSONP с Spring 3.0 и Джексоном - PullRequest
       52

JSONP с Spring 3.0 и Джексоном

14 голосов
/ 05 октября 2011

Чтобы вернуть ответ JSON с помощью Spring 3.0, достаточно добавить аннотацию @ResponseBody вместе с @RequestMapping внутри @Controller. При условии, что библиотека MapppingJacksonJson загружена и клиент отправляет заголовок Accept с application/json, он будет работать.

А как насчет JSONP? Можно ли его вернуть и как?

Ответы [ 5 ]

12 голосов
/ 15 октября 2014

Поскольку 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;
    }
}
12 голосов
/ 25 января 2013

В этом блоге показано правильное и компактное решение: Реализация JSONP в Spring MVC 3.0.x

Это лучше работает для Spring 3.1: XML, JSON, JSON-Конечные точки веб-службы в Spring 3.1

Для Spring 3.2 приведен конвертер JSONP на основе Jackson2:

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);
        }
    }
}

Чтобы добавить его, добавьте этот компонент в свою конфигурацию:

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 );
    }

}
10 голосов
/ 05 октября 2011

См. Ответ Джереми Грель на в этом блоге .Вот другой учебник .

2 голосов
/ 15 сентября 2014

Я искал более простой подход OOB для подхода JSONP (JSONP / CORS должен быть встроенным в IMO ... не требовать никакого специального кода) ... никогда не находил никакого ... но после того, как связался с Spring В команде выясняется, что JSONP теперь поддерживается OOB в 4.0.5 через MappingJacksonJsonView, а встроенный supportCORS последует позже.

1 голос
/ 22 марта 2013

Посмотрите на https://github.com/bhagyas/spring-jsonp-support

Надеюсь, это поможет.

...