복붙노트

[SPRING] Spring 3.0과 Jackson이있는 JSONP

SPRING

Spring 3.0과 Jackson이있는 JSONP

Spring 3.0에서 JSON 응답을 반환하려면 @ResponseBody 주석을 @Controller 내부의 @RequestMapping과 함께 추가하면 충분합니다. MapppingJacksonJson 라이브러리가로드되고 클라이언트가 application / json과 함께 Accept 헤더를 보내는 경우, 작동합니다.

JSONP는 어떻습니까? 그것을 반환 할 수 있습니까?

해결법

  1. ==============================

    1.이 블로그 게시물에 대한 Jeremy Grelle의 답변을 참조하십시오. 여기에 또 다른 튜토리얼이 있습니다.

    이 블로그 게시물에 대한 Jeremy Grelle의 답변을 참조하십시오. 여기에 또 다른 튜토리얼이 있습니다.

  2. ==============================

    2.이 블로그 게시물은 정확하고 압축 된 솔루션을 보여줍니다. Spring MVC 3.0.x에서 JSONP 구현하기

    이 블로그 게시물은 정확하고 압축 된 솔루션을 보여줍니다. Spring MVC 3.0.x에서 JSONP 구현하기

    이것은 Spring 3.1에서 더 잘 작동합니다 : Spring 3.1의 XML, JSON, JSON-P 웹 서비스 끝점

    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 );
        }
    
    }
    
  3. ==============================

    3.Spring 4.1부터는 다음과 같이 쉽게 할 수 있습니다 :

    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;
        }
    }
    
  4. ==============================

    4.JSONP 접근법 (JSONP / CORS가 내장 된 IMO ... 사용자 정의 코드 필요 없음)에 대한보다 간단한 OOB 접근 방식을 찾고있었습니다 ... 결코 발견 된 바는 없지만 Spring 팀에 문의 한 후 이제 JSONP가 MappingJacksonJsonView를 통해 4.0.5에서 OOB로 지원되고 나중에 지원하기 위해 supportCORS가 내장되어 있습니다.

    JSONP 접근법 (JSONP / CORS가 내장 된 IMO ... 사용자 정의 코드 필요 없음)에 대한보다 간단한 OOB 접근 방식을 찾고있었습니다 ... 결코 발견 된 바는 없지만 Spring 팀에 문의 한 후 이제 JSONP가 MappingJacksonJsonView를 통해 4.0.5에서 OOB로 지원되고 나중에 지원하기 위해 supportCORS가 내장되어 있습니다.

  5. ==============================

    5.https://github.com/bhagyas/spring-jsonp-support에서 살펴보십시오.

    https://github.com/bhagyas/spring-jsonp-support에서 살펴보십시오.

    도움이되기를 바랍니다.

  6. from https://stackoverflow.com/questions/7655975/jsonp-with-spring-3-0-and-jackson by cc-by-sa and MIT license