2015-08-21 20 views
0

我有一個充當映像服務器的spring-boot應用程序。我張貼圖像被堅持到mongodb。然後我檢索它,調整大小並返回它。Spring MVC Rest無法通過「找不到可接受的表示錯誤」返回JPEG

下面是該項目的配置:

@Configuration 
public class AllResources extends WebMvcConfigurerAdapter { 

    @Override 
    public void configurePathMatch(PathMatchConfigurer matcher) { 
     matcher.setUseRegisteredSuffixPatternMatch(true); 
    } 
} 

這裏是終點:

@RequestMapping(value = "images/{filename}", method = RequestMethod.GET) 
@ResponseBody 
public ResponseEntity<BufferedImage> getSizedImage(@PathVariable String filename, @RequestParam int width, @RequestParam int height) throws Exception { 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.IMAGE_PNG); 

    GridFSDBFile savedFile = mongoFileService.getStore(filename); 

    if (savedFile != null) { 
     try { 
      BufferedImage image = ImageIO.read(savedFile.getInputStream()); 
      image = resize(image, Method.SPEED, width, height, Scalr.OP_ANTIALIAS); 

      LOGGER.info("Returning Filename " + savedFile.getFilename() + " sized to " + width + " X " + height); 

      return new ResponseEntity<BufferedImage>(image, headers, HttpStatus.OK); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      LOGGER.error("Error sizing file " + filename + ": " + ex.getMessage()); 
      return new ResponseEntity<BufferedImage>(null, headers, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } else { 
     LOGGER.error("Could not find requested file " + filename); 
     return new ResponseEntity<BufferedImage>(null, headers, HttpStatus.NOT_FOUND); 
    } 
} 

的圖像檢索和大小(我在的IntelliJ調試時實際預覽)。但返回時,我收到以下錯誤:

Controller [org.springframework.boot.autoconfigure.web.BasicErrorController] 
Method [public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)] 

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:195) 

而且我看到這在日誌中:

Method [error] returned [<406 Not Acceptable,{timestamp=Sat Aug 22 11:05:59 MDT 2015, status=406, error=Not Acceptable, exception=org.springframework.web.HttpMediaTypeNotAcceptableException, message=Could not find acceptable representation, path=/images/1440263145562_profile_04132015.PNG},{}>] 
2015-08-22 11:05:59.711 DEBUG 2478 --- [0.1-3000-exec-3] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Written [{timestamp=Sat Aug 22 11:05:59 MDT 2015, status=406, error=Not Acceptable, exception=org.springframework.web.HttpMediaTypeNotAcceptableException, message=Could not find acceptable representation, path=/images/1440263145562_profile_04132015.PNG}] as "application/json;charset=UTF-8" using [org.springfr[email protected]5bf1ba3a] 
2015-08-22 11:05:59.711 DEBUG 2478 --- [0.1-3000-exec-3] o.s.web.servlet.DispatcherServlet  : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 

我與&試過不和@ResponseBody它不會出現也有所作爲。我有正確的產品和內容類型設置(我認爲)。

我添加這些轉換器(雖然我認爲SpringBoot提供這些),但無濟於事:

@Configuration 
public class AllResources extends WebMvcConfigurerAdapter { 

    @Override 
    public void configurePathMatch(PathMatchConfigurer matcher) { 
     matcher.setUseRegisteredSuffixPatternMatch(true); 
    } 
    @Bean 
    public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter(){ 
     ByteArrayHttpMessageConverter bam = new ByteArrayHttpMessageConverter(); 
     List<org.springframework.http.MediaType> mediaTypes = new LinkedList<MediaType>(); 
     mediaTypes.add(org.springframework.http.MediaType.APPLICATION_JSON); 
     mediaTypes.add(org.springframework.http.MediaType.IMAGE_JPEG); 
     mediaTypes.add(org.springframework.http.MediaType.IMAGE_PNG); 
     mediaTypes.add(org.springframework.http.MediaType.IMAGE_GIF); 
     mediaTypes.add(org.springframework.http.MediaType.TEXT_PLAIN); 
     bam.setSupportedMediaTypes(mediaTypes); 
     return bam; 
    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     MappingJackson2HttpMessageConverter mapper = new MappingJackson2HttpMessageConverter(); 
     converters.add(mapper); 
     converters.add(byteArrayHttpMessageConverter()); 
     super.configureMessageConverters(converters); 
    } 
} 

我希望有人能看到是什麼原因造成了這個問題。

+1

嗨,夥計。讓你的問題標題是你遇到的一些更常見的問題或錯誤名稱。所以更多的人會訪問..u可能會得到很多聲譽..希望你明白我說的話 –

回答

1

嘗試這段代碼

@RequestMapping("/sparklr/photos/{id}") 
public ResponseEntity<BufferedImage> photo(@PathVariable String id) throws Exception { 
    InputStream photo = sparklrService.loadSparklrPhoto(id); 
    if (photo == null) { 
     throw new UnavailableException("The requested photo does not exist"); 
    } 
    BufferedImage body; 
    MediaType contentType = MediaType.IMAGE_JPEG; 
    Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByMIMEType(contentType.toString()); 
    if (imageReaders.hasNext()) { 
     ImageReader imageReader = imageReaders.next(); 
     ImageReadParam irp = imageReader.getDefaultReadParam(); 
     imageReader.setInput(new MemoryCacheImageInputStream(photo), true); 
     body = imageReader.read(0, irp); 
    } else { 
     throw new HttpMessageNotReadableException("Could not find javax.imageio.ImageReader for Content-Type [" 
       + contentType + "]"); 
    } 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.IMAGE_JPEG); 
    return new ResponseEntity<BufferedImage>(body, headers, HttpStatus.OK); 
} 

編輯: 我們不得不配置的MessageConverter

@Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new BufferedImageHttpMessageConverter()); 
    } 

在這裏,我有這樣的

@Bean 
public ContentNegotiatingViewResolver contentViewResolver() throws Exception { 
    ContentNegotiatingViewResolver contentViewResolver = new ContentNegotiatingViewResolver(); 
    ContentNegotiationManagerFactoryBean contentNegotiationManager = new ContentNegotiationManagerFactoryBean(); 
    contentNegotiationManager.addMediaType("json", MediaType.APPLICATION_JSON); 
    contentViewResolver.setContentNegotiationManager(contentNegotiationManager.getObject()); 
    contentViewResolver.setDefaultViews(Arrays.<View> asList(new MappingJackson2JsonView())); 
    return contentViewResolver; 
} 

我覺得內容談判你的日誌裏面的消息c清楚你的疑惑。仔細看看你的日誌並再次給我評論

+0

我更新了我的問題,並提出了您的建議。我仍然得到同樣的錯誤。我需要爲BufferedImage註冊一個處理程序嗎? – sonoerin

+0

看我的編輯..有什麼,你需要 –

+0

謝謝!我錯誤地認爲Spring-Boot加載了消息轉換器。 – sonoerin

1

我認爲問題是沒有一個已註冊的消息轉換器知道如何將BufferedImage寫入accept頭所指定格式的響應中。嘗試註冊自己的消息轉換器,該轉換器知道如何以請求的格式寫出BufferedImage

+0

我加了消息轉換器,但他們似乎沒有幫助。 – sonoerin

相關問題