2012-02-23 2 views
1

응용 프로그램에서 java.awt.BufferedImage 객체로 이미지를 제공하려고합니다.BufferedImage를 제공하는 동안 Spring MVC 내용 협상이 실패합니다.

  • 하는 것은 허용 : 나는 GET을 수행 할 때, 여기에 결과입니다 이미지/JPEG 유효한 사진을 렌더링
  • 수락 : */*는 HTTP 여기에 406

를 반환 관련되어 내 서블릿의 context.xml의 일부 :

@RequestMapping(value = "photo/{photoId:[0-9]+}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) 
    @ResponseBody 
    public BufferedImage getPhoto(
     @PathVariable long photoId) { 
     return photoService.getPhoto(photoId); 
    } 
: 여기

<beans:bean id="messageAdapter" 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <beans:property name="order" value="1" /> 
    <beans:property name="messageConverters"> 
     <beans:array> 
      <beans:bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/> 
     </beans:array> 
    </beans:property> 

</beans:bean> 

그리고 내 컨트롤러입니다

MediaType.IMAGE_JPEG_VALUE은 (는) "image/jpeg"입니다. */*의 accept 헤더가 결코 HTTP 406을 생성하지 않는다는 것을 이해합니다. this page에 따르면 호출자가 해당 유형의 내용을 허용하지 않는다고 알려줍니다.

대부분의 브라우저는 수락 헤더에 "*/*"가 있고 사용자가 수락 헤더를 하드 코딩하지 않으면이 이미지를 볼 수 없기 때문에 이것은 문제입니다.

여기에 뭔가가 있습니까?

미리 감사드립니다.

답변

2

메시지 변환기는 Accept 헤더에 대해 까다롭기 때문에 메시지 변환기는 @ResponseBody으로 주석 된 모든 처리기에 적용되므로 사용해야합니다.

이 주위에 얻을 수있는 몇 가지 방법 :

옵션 1 :뿐만 아니라 */*을 처리하기 위해 주를 BufferedImageHttpMessageConverter 확장 : 당신이 모든으로 나중에 다른 메시지 컨버터를 추가하면이 의도하지 않은 결과를 초래할 수 있습니다 JSON을 생성하려는 갑자기 처리기가 대신 이미지를 생성하기 시작합니다.

public class ExtendedBufferedImageHttpMessageConverter extends BufferedImageHttpMessageConverter { 

    @Override 
    public boolean canWrite(Class<?> clazz, MediaType mediaType) { 
    if (mediaType.equals(MediaType.ALL)) { 
     return super.canWrite(clazz, MediaType.IMAGE_JPEG); 
    } else { 
     return super.canWrite(clazz, mediaType); 
    } 
} 

는 그런 다음 스프링 설정에서 일반 BufferedImageHttpMessageConverter 대신 사용합니다.

옵션 2 : 이미지 요청에 적용되는 필터 나 인터셉터를 작성하고 Accept 헤더 image/jpeg 대신 */*처럼 보이는 이러한 방법으로 요청을 포장. 이것은 클라이언트가 jpeg를 수락하고 BufferedImageHttpMessageConverter를 트리거하는 것으로 생각하여 봄을 "트릭"합니다.

+0

흥미 진진한. 이 문제에 대한 명확한 설명이 있지만 응용 프로그램/json 데이터도 제공해야합니다. 내 예제에서는 그것을 포함하지 않았지만 MappingJacksonHttpMessageConverter도 사용합니다. 물론 그것이 다시 추가되었을 때 서블릿은 이미지를 직렬화하고 JSON을 반환하려고했습니다. 나는 내가 의도 한대로 BufferedImageHttpMessageConverter를 사용하려고 노력하고 있다고 생각한다. – Joe

+0

또한이 문제를 해결하기 위해 추가하고 싶었습니다 (또는 아마도 해결책입니다). @ResponseBody의 바이트 배열에 원시 데이터를 넣고 image/jpeg를 지원하는 ByteArrayHttpMessageConverter를 포함 시켰습니다. 나는 누군가가 관심이있는 경우이를위한 출처를 포함 할 수 있습니다. – Joe