1
파일 다운로드 기능이있는 간단한 REST API가 있습니다. 엔드 포인트는 다음과 같이 정의된다 :404를 반환하기 위해 Spring REST 파일 다운로드를 얻으려면 어떻게해야합니까?
try {
FileSystemResource fsr =
new FileSystemResource("C:/myfiles/" + fileName + "." + suffix);
} catch (Throwable e) {
throw new UnknownFileException();
}
그리고 나는 404
@ExceptionHandler(UnknownFileException.class)
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorMessage handleUnknownFileException(
UnknownFileException e, HttpServletRequest req) {
return new ErrorMessage(e);
}
을 반환하는 간단한 예외 핸들러를 가지고 :
@RequestMapping(value = "/myapi/files/{fileName}",
method = RequestMethod.GET,
produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE })
@ResponseBody FileSystemResource downloadFile(String fileName)
throws UnknownFileException;
구현 방법의 고기가 현재 이러한 예외 처리기는 XML/JSON 응답을 반환하는 다른 작업에 적합합니다. 내가 가진 문제는이 메서드가 예외를 throw하면 클라이언트에 500 오류를 반환하는 Spring ResourceHttpMessageConverter에 의해 가로채는 것처럼 보입니다.
제 질문은 일반 HTTP 대신 HTTP 404가 반환되도록하는 방법입니다.
편집 - 그것은 가치가 무엇인지에 대해서는 아래 스택 추적 : 당신이 방법에 HttpServletResponse를 추가해야합니다, 물론
response.setStatus(HttpStatus.NOT_FOUND.value());
:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.....UnknownFileException: Unable to find file
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
참고로 'Throwable'을 잡아 내거나 'Error'예외를 지정하는 것은 좋지 않습니다. 'Error'는 주요 VM 또는 하드웨어 오류이며 코드의 중간에서 적절하게 처리 할 수 없습니다. 자신의 예외 클래스 'Error'를 호출하면 혼동이 생길 수 있습니다. – chrylis
'Error' 클래스가 자신의 것입니까? 또는 JDK? –
해당 오류 클래스는 예외가 아닙니다. 그것은 XML/JSON 어노테이션을 가진 저의 작은 모델 객체입니다. 내 경험에 비추어 볼 때, 모든 상황에서 응답을 제어해야하므로 웹 서비스에서 Throwable을 잡아 내지 않는 것이 매우 바람직하지 않습니다. – Steve