2017-04-20 3 views
1
@RequestMapping(value = "/all", method = RequestMethod.GET) 
public ResponseEntity<List<ItemVO>> listAll() { 
    ResponseEntity<List<ItemVO>> entity = null; 
    try { 


     List<ItemVO> list=service.listAll(); 
     for(ItemVO i : list){ 
      InputStream in = getClass().getClassLoader().getResourceAsStream(i.getFilepath_img()); 

      i.setByte_img(IOUtils.toByteArray(in)); 

     } 
      final HttpHeaders headers = new HttpHeaders(); 
      headers.setContentType(MediaType.IMAGE_PNG); 
     entity = new ResponseEntity<List<ItemVO>>(list, HttpStatus.OK); 

    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
     entity = new ResponseEntity<>(HttpStatus.BAD_REQUEST); 
    } 

    return entity; 
} 

이미지가 SRC/메인/웹 애플리케이션/자원/IMG 폴더에있는같이 getResourceAsStream 반환 NullpointException (spring4)

public class ItemVO{ 
    private int item_id; 
    private String filepath_img; 
    private byte[] byte_img; 
} 

VO,

저장된 파일 경로 같다 "/ IMG/XXX

자바 : .PNG "

내가 스택 추적을 할 수 무슨 생각이 없다 .lang.NullPointerException

at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2146) 

at org.apache.commons.io.IOUtils.copy(IOUtils.java:2102) 

at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123) 

at org.apache.commons.io.IOUtils.copy(IOUtils.java:2078) 

at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:721) 
+0

'i.getFilepath_img()'경로를 확인 했습니까? –

+0

네, 잘 작동 했습니까? – hsyou

+0

목적을 확인하기 위해이 경로로 시도하십시오. main/webapp/resources/img/xxx.png' –

답변

1

webapp/resources/..이 클래스 경로에 없습니다. 당신은 그것을 주입 ServletContext

를 사용하여이 문제를 해결할 수 : 그러면 얻을

@Autowired 
private ServletContext servletContext; 

InputStream :

  • getFilepath_img() 절대 경로를 반환

    InputStream in = servletContext.getResourceAsStream(i.getFilepath_img()); 
    

    이 코드는 가정합니다 친척을 웹 응용 프로그램 컨텍스트에 연결합니다. /resources/img/xxx.png. 그렇지 않으면 예를 들어 경로를 앞에 추가해야합니다. 또는 /

+0

고맙습니다! – hsyou

0

Spring’s Resource 인터페이스 미행 자원 "/resources/" + i.getFilepath_img()없이 낮은 수준의 자원에 대한 액세스를 추출하기위한보다 가능한 인터페이스 일을 의미한다.

/autowire를 ResourceLoader에 삽입하고 리소스를 가져와야합니다. 모든 응용 프로그램 컨텍스트는 ResourceLoader 인터페이스를 구현하므로 모든 응용 프로그램 컨텍스트를 사용하여 Resource 인스턴스를 얻을 수 있습니다. 예를 들어

: 다음

@Autowired 
private ResourceLoader context; 

그리고 :

Resource image = context.getResource(i.getFilepath_img()); 
InputStream is = image.getInputStream(); 
... 

이 URL, 파일 또는 클래스 패스 리소스로 파일 경로를 지정하거나 기본의 ApplicationContext에 의존하면 할 수있게된다. 자세한 내용은 Table 8.1 Resource Strings을 참조하십시오.