当前位置: 首页 > 知识库问答 >
问题:

使用ServletContext返回图像

翟棋
2023-03-14

我试图用ServletContext返回一个图像,但出现500个错误,控制台显示:

java.lang.NullPointerException: null at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2146) 在 org.apache.commons.io.io.ioUtils.copy(IOUtils.java:2102) 在 org.apache.commons.io.io.utils.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);

restful服务:

@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;
    }

图像位于资源中 -

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


共有2个答案

麹耘豪
2023-03-14

在http://www . xyzws . com/servlet FAQ/how-to-use-servletcontextgetresourceasstreamjavalangstring-path/18中,该行

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

在图像前应该有一个/

庄博厚
2023-03-14
匿名用户

图像服务类中,您自动连接 ServletContext 实例。

Spring容器不会自动连接servletContext,因为它不是springbeanServletContext来自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实例注入Controllerlayer之外。这里,我们在服务层中注入,这不是推荐的方法。

希望这有帮助!

 类似资料:
  • 我正在使用routerLink返回我的页面。 当前路线可以有3个级别: 此外,我有一些不同的组件,所以它不一定总是父级,它可以是parent1或parent2,也可以是子级和孙级,例如: 我想要的总是转到上一级,例如: 我所做的是: 但它总是导航到“myurl.com” 我如何解决它? 正如一些用户所建议的,我正在共享我的路由配置: 应用程序内。路由。ts: 在父级中。路由。ts: 如果我在浏览器

  • 数据库中的每一行都是这样的 现在我想这样返回上面的数据 我将Spring的JdbcTemplate与行映射器一起使用,但我只能得到所有行的列表。由于我无法在RowMapper中维护我的主映射(我可以在RowMapper类中有一个静态映射吗?但我不希望它是静态的,因为这是一个webservice,后续调用可能会出错。),我只能选择获取该行列表,然后使用逻辑创建所需的集合。 我开始了解,但我找不到如何

  • 我正在使用Spring boot来渲染页面。我也使用了叶子。但是我在从浏览器调用它时得到了下面提供的异常。 我已经编写了视图解析器类,当我使用为此。 和我在应用程序中提到的一样。yml也是。应用yml是 这是我的Controller类,负责渲染index.jspMainController.class

  • 问题内容: 我正在为我的网站创建自动完成功能。到目前为止,javascript部分已经结束。另外,我可以获取匹配用户的MembershipUser对象。 我需要以以下格式返回JSON: 这是ashx中的代码: 如何以所需格式返回json?谢谢。 问题答案:

  • 我正在尝试使用wp rest api返回一个博客帖子列表,包括标题、摘录和特色图片。使用下面的方法,我可以返回标题和摘录,但特征图像会导致致命错误:无法将stdClass类型的对象用作数组。 有人能告诉我我做错了什么吗?

  • 问题内容: 我有以下简单的看法。为什么会导致此错误? 问题答案: 因为视图必须 返回 ,而不仅仅是调用它。将最后一行更改为