Richard G
Richard G

Reputation: 5693

HttpMediaTypeNotAcceptableException: Could not find acceptable representation spring mvc

This is driving me crazy! I'm trying to serve a JPG image. I am sure this method was working fine the other day, so I don't know what's changed. I've tried many different things to get it to work but I can't seem to get past the exception.

Basically I'm trying to serve an image from the database.

I thought maybe the actual bytes are corrupt so I wrote them to a file, and checked the file content. Just in Finder on Mac, the file in the temp directory looks fine in the preview application so I'm pretty sure it's not the content itself causing the problem.

This is the controller method:

@RequestMapping(value="/binaries/**", method = RequestMethod.GET, produces={MediaType.APPLICATION_JSON_VALUE, MediaType.IMAGE_GIF_VALUE,
            MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE, "application/javascript"})
    public @ResponseBody
    ResponseEntity<byte[]> serveResource(WebRequest webRequest, HttpServletResponse response, String uri) throws IOException {
        String path = (String)request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE );

        BinaryFile bf = binaryService.findByUri(path);
        String tmpdir = System.getProperty("java.io.tmpdir");
        File dest = new File(tmpdir + File.separator + bf.getFileName());
        FileUtils.writeByteArrayToFile(dest, bf.getResource());
        logger.debug("file written: " + dest.getAbsolutePath());
//        response.addHeader("Cache-Control", "public, max-age=3600");

        if (webRequest.checkNotModified(bf.getLastModifiedDate().toDate().getTime()))
        {
            return null;
        };
        return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(bf.getResource());
    }

This is the exception:

Request: http://localhost:8080/binaries/products/shortcode_1/test_image2.jpg raised org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Anyone have any ideas? It's Spring 4.1.4.RELEASE

Upvotes: 2

Views: 2395

Answers (1)

Richard G
Richard G

Reputation: 5693

Oh never mind, I figured out what changed. I'd overridden the MessageConverters because I was working on some Jackson stuff, so the fix was that I needed to manually add back the ByteArrayHttpMessageConverter.

@Bean
    public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter(){
        ByteArrayHttpMessageConverter bam = new ByteArrayHttpMessageConverter();
        List<org.springframework.http.MediaType> mediaTypes = new LinkedList<org.springframework.http.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();
        ObjectMapper om = new ObjectMapper();
        om.registerModule(new JodaModule());
        om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.setObjectMapper(om);
        converters.add(mapper);

        converters.add(byteArrayHttpMessageConverter());

        super.configureMessageConverters(converters);
    }

Upvotes: 3

Related Questions