我正在尝试使用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 -------
答案 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的父)。