使用ServletContext

时间:2017-06-06 16:31:26

标签: spring-boot

我正在尝试使用ServletContext返回一个图像,但是我得到一个500错误,控制台说:

  

java.lang.NullPointerException:null         在org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2146)         在org.apache.commons.io.IOUtils.copy(IOUtils.java:2102)         在org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123)         在org.apache.commons.io.IOUtils.copy(IOUtils.java:2078)         在org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:721)

配置:

@Configuration
public class ImageConfiguration {

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(byteArrayHttpMessageConverter());
    }

    @Bean
    public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
        ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
        arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());
        return arrayHttpMessageConverter;
    }

    private List<MediaType> getSupportedMediaTypes() {
        List<MediaType> list = new ArrayList<MediaType>();
        list.add(MediaType.IMAGE_JPEG);
        list.add(MediaType.IMAGE_PNG);
        list.add(MediaType.APPLICATION_OCTET_STREAM);
        return list;
    }
}

服务:

@Service
public class ImageService {

    @Autowired
    ServletContext servletContext;

    public byte[] getRankImage (String id) throws IOException {

        byte[] b;

            InputStream in;


        if (id.equals("0")) {
            in = servletContext.getResourceAsStream("images/level-0.png");
            return IOUtils.toByteArray(in);

宁静的服务:

@RequestMapping(value = "/level/{id}", method = RequestMethod.GET)
    public ResponseEntity<byte[]> getImage(@PathVariable("id") String id) {
        byte[] imageBytes;

        try {
            imageBytes = imageService.getRankImage(id);
            return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG).body(imageBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

当我查看war文件时,我确认它们在那里,图像位于resources -> images -> {image_name}。我不确定我是否做错了,或者我需要以不同的方式处理这条路径。

---------更新1 -------

我拿了war文件并在apache中手动部署它,这是输出: enter image description here

2 个答案:

答案 0 :(得分:0)

ImageService课程中,您自动安装了ServletContext个实例。

Spring容器不会自动装配servletContext,因为它不是一个spring bean。 ServletContext来自javax.servlet个包。

您可以使用setter方法注入实例,如下所示。

@Service
public class ImageService implements ServletContextAware{

     private ServletContext context;

     public void setServletContext(ServletContext servletContext) {
        this.context = servletContext;
     }

     // use `context` object to get the image and pass to IOUtils.toByteArray method
}

通过实现ServletContextAware接口,Spring会为您注入它。

理想情况下,我们不应该在ServletContext图层之外注入Controller个实例。在这里,我们注入Service层,这不是推荐的方法。

希望这有帮助!

答案 1 :(得分:0)

来自http://www.xyzws.com/servletfaq/how-to-use-servletcontextgetresourceasstreamjavalangstring-path/18

in = servletContext.getResourceAsStream("images/level-0.png");

应该在 images 之前/,并且路径应该相对于当前上下文根(WEB-INF的父)。