[SPRING] Spring-MVC 컨트롤러에서 트리거 404?
SPRINGSpring-MVC 컨트롤러에서 트리거 404?
404를 트리거하는 스프링 3.0 컨트롤러를 얻으려면 어떻게해야합니까?
@RequestMapping (value = "/ **", method = RequestMethod.GET) 컨트롤러가 있고 컨트롤러에 액세스하는 일부 URL의 경우 컨테이너에 404가 필요합니다.
해결법
-
==============================
1.Spring 3.0 이후 @ResponseStatus 주석으로 선언 된 Exception을 던질 수있다.
Spring 3.0 이후 @ResponseStatus 주석으로 선언 된 Exception을 던질 수있다.
@ResponseStatus(value = HttpStatus.NOT_FOUND) public class ResourceNotFoundException extends RuntimeException { ... } @Controller public class SomeController { @RequestMapping..... public void handleCall() { if (isFound()) { // whatever } else { throw new ResourceNotFoundException(); } } }
-
==============================
2.HttpServletResponse를 매개 변수로 받아들이도록 메소드 서명을 다시 작성하여 setStatus (int)를 호출 할 수 있도록하십시오.
HttpServletResponse를 매개 변수로 받아들이도록 메소드 서명을 다시 작성하여 setStatus (int)를 호출 할 수 있도록하십시오.
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
-
==============================
3.나는 Spring에서 기본적으로 제공하는 404에 대한 예외 (뿐만 아니라)가 있음을 언급하고자한다. 자세한 내용은 Spring 설명서를 참조하십시오. 그래서 당신이 당신 자신의 예외를 필요로하지 않는다면 이것을 간단히 할 수 있습니다 :
나는 Spring에서 기본적으로 제공하는 404에 대한 예외 (뿐만 아니라)가 있음을 언급하고자한다. 자세한 내용은 Spring 설명서를 참조하십시오. 그래서 당신이 당신 자신의 예외를 필요로하지 않는다면 이것을 간단히 할 수 있습니다 :
@RequestMapping(value = "/**", method = RequestMethod.GET) public ModelAndView show() throws NoSuchRequestHandlingMethodException { if(something == null) throw new NoSuchRequestHandlingMethodException("show", YourClass.class); ... }
-
==============================
4.Spring 3.0.2부터 컨트롤러 메소드의 결과로 ResponseEntity
를 리턴 할 수있다. Spring 3.0.2부터 컨트롤러 메소드의 결과로 ResponseEntity
를 리턴 할 수있다. @RequestMapping..... public ResponseEntity<Object> handleCall() { if (isFound()) { // do what you want return new ResponseEntity<>(HttpStatus.OK); } else { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } }
(ResponseEntity
는 @ResponseBody 주석보다 유연합니다 - 다른 질문 참조) -
==============================
5.@ControllerAdvice를 사용하여 예외를 처리 할 수 있습니다. @ControllerAdvice 주석 클래스의 기본 동작은 알려진 모든 컨트롤러를 지원합니다.
@ControllerAdvice를 사용하여 예외를 처리 할 수 있습니다. @ControllerAdvice 주석 클래스의 기본 동작은 알려진 모든 컨트롤러를 지원합니다.
그래서 당신이 가진 컨트롤러가 404 오류를 던지면 호출됩니다.
다음과 같이하십시오.
@ControllerAdvice class GlobalControllerExceptionHandler { @ResponseStatus(HttpStatus.NOT_FOUND) // 404 @ExceptionHandler(Exception.class) public void handleNoTFound() { // Nothing to do } }
다음과 같이 web.xml에이 404 응답 오류를 매핑하십시오.
<error-page> <error-code>404</error-code> <location>/Error404.html</location> </error-page>
도움이되기를 바랍니다.
-
==============================
6.컨트롤러 메소드가 파일 처리와 같은 것을위한 것이라면, ResponseEntity는 매우 편리합니다 :
컨트롤러 메소드가 파일 처리와 같은 것을위한 것이라면, ResponseEntity는 매우 편리합니다 :
@Controller public class SomeController { @RequestMapping..... public ResponseEntity handleCall() { if (isFound()) { return new ResponseEntity(...); } else { return new ResponseEntity(404); } } }
-
==============================
7.표시된 대답이 맞으면 예외없이이를 성취 할 수있는 방법이 있습니다. 서비스는 검색된 객체의 선택적
을 반환하며, 발견되면 HttpStatus.OK에 매핑되고 비어 있으면 404에 매핑됩니다. 표시된 대답이 맞으면 예외없이이를 성취 할 수있는 방법이 있습니다. 서비스는 검색된 객체의 선택적
을 반환하며, 발견되면 HttpStatus.OK에 매핑되고 비어 있으면 404에 매핑됩니다. @Controller public class SomeController { @RequestMapping..... public ResponseEntity<Object> handleCall() { return service.find(param).map(result -> new ResponseEntity<>(result, HttpStatus.OK)) .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); } } @Service public class Service{ public Optional<Object> find(String param){ if(!found()){ return Optional.empty(); } ... return Optional.of(data); } }
-
==============================
8.나는 HttpClientErrorException을 던지는 것을 권하고 싶다.
나는 HttpClientErrorException을 던지는 것을 권하고 싶다.
@RequestMapping(value = "/sample/") public void sample() { if (somethingIsWrong()) { throw new HttpClientErrorException(HttpStatus.NOT_FOUND); } }
서블릿 출력 스트림에 무엇인가가 쓰여지 기 전에 만 할 수 있다는 것을 명심해야한다.
-
==============================
9.또한 컨트롤러에서 404 상태를 반환하려면이 작업을 수행하면됩니다.
또한 컨트롤러에서 404 상태를 반환하려면이 작업을 수행하면됩니다.
@RequestMapping(value = "/somthing", method = RequestMethod.POST) @ResponseBody public HttpStatus doSomthing(@RequestBody String employeeId) { try{ return HttpStatus.OK; } catch(Exception ex){ return HttpStatus.NOT_FOUND; } }
이렇게하면 컨트롤러에서 404를 반환하려는 경우 404 오류가 발생합니다.
-
==============================
10.조금 늦었지만 Spring Data REST를 사용하고 있다면 이미 org.springframework.data.rest.webmvc.ResourceNotFoundException이있다. 또한 @ResponseStatus 주석을 사용합니다. 더 이상 사용자 정의 런타임 예외를 만들 필요가 없습니다.
조금 늦었지만 Spring Data REST를 사용하고 있다면 이미 org.springframework.data.rest.webmvc.ResourceNotFoundException이있다. 또한 @ResponseStatus 주석을 사용합니다. 더 이상 사용자 정의 런타임 예외를 만들 필요가 없습니다.
-
==============================
11.web.xml을 사용하여 오류 코드 및 404 오류 페이지를 추가하기 만하면됩니다. 그러나 404 오류 페이지가 WEB-INF 아래에 있지 않아야합니다.
web.xml을 사용하여 오류 코드 및 404 오류 페이지를 추가하기 만하면됩니다. 그러나 404 오류 페이지가 WEB-INF 아래에 있지 않아야합니다.
<error-page> <error-code>404</error-code> <location>/404.html</location> </error-page>
이것은 가장 간단한 방법이지만 몇 가지 제한이 있습니다. 이 페이지에 다른 페이지를 추가 한 것과 동일한 스타일을 추가하려는 경우를 가정하십시오. 이런 식으로 당신은 그렇게 할 수 없습니다. @ResponseStatus (value = HttpStatus.NOT_FOUND)를 사용해야합니다.
-
==============================
12.설정으로 web.xml 구성
설정으로 web.xml 구성
<error-page> <error-code>500</error-code> <location>/error/500</location> </error-page> <error-page> <error-code>404</error-code> <location>/error/404</location> </error-page>
새 컨트롤러 만들기
/** * Error Controller. handles the calls for 404, 500 and 401 HTTP Status codes. */ @Controller @RequestMapping(value = ErrorController.ERROR_URL, produces = MediaType.APPLICATION_XHTML_XML_VALUE) public class ErrorController { /** * The constant ERROR_URL. */ public static final String ERROR_URL = "/error"; /** * The constant TILE_ERROR. */ public static final String TILE_ERROR = "error.page"; /** * Page Not Found. * * @return Home Page */ @RequestMapping(value = "/404", produces = MediaType.APPLICATION_XHTML_XML_VALUE) public ModelAndView notFound() { ModelAndView model = new ModelAndView(TILE_ERROR); model.addObject("message", "The page you requested could not be found. This location may not be current."); return model; } /** * Error page. * * @return the model and view */ @RequestMapping(value = "/500", produces = MediaType.APPLICATION_XHTML_XML_VALUE) public ModelAndView errorPage() { ModelAndView model = new ModelAndView(TILE_ERROR); model.addObject("message", "The page you requested could not be found. This location may not be current, due to the recent site redesign."); return model; } }
from https://stackoverflow.com/questions/2066946/trigger-404-in-spring-mvc-controller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 보안을 이용한 유닛 테스트 (0) | 2018.12.21 |
---|---|
[SPRING] 의존성 주입 용기의 장점은 무엇입니까? (0) | 2018.12.21 |
[SPRING] Spring RESTful 애플리케이션을 위해 ResponseEntity <T>와 @RestController를 사용할 때 (0) | 2018.12.21 |
[SPRING] Spring의 GA, RC 및 M2 릴리스의 차이점은 무엇입니까? (0) | 2018.12.21 |
[SPRING] 거래로 상향 조정 (0) | 2018.12.21 |