2013-10-25 1 views
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) 
+0

참고로 'Throwable'을 잡아 내거나 'Error'예외를 지정하는 것은 좋지 않습니다. 'Error'는 주요 VM 또는 하드웨어 오류이며 코드의 중간에서 적절하게 처리 할 수 ​​없습니다. 자신의 예외 클래스 'Error'를 호출하면 혼동이 생길 수 있습니다. – chrylis

+0

'Error' 클래스가 자신의 것입니까? 또는 JDK? –

+0

해당 오류 클래스는 예외가 아닙니다. 그것은 XML/JSON 어노테이션을 가진 저의 작은 모델 객체입니다. 내 경험에 비추어 볼 때, 모든 상황에서 응답을 제어해야하므로 웹 서비스에서 Throwable을 잡아 내지 않는 것이 매우 바람직하지 않습니다. – Steve

답변

1

당신은 아마 이런 일을하고 싶지 선언.

관련 문제