복붙노트

[SPRING] Spring-MVC 컨트롤러에서 트리거 404?

SPRING

Spring-MVC 컨트롤러에서 트리거 404?

404를 트리거하는 스프링 3.0 컨트롤러를 얻으려면 어떻게해야합니까?

@RequestMapping (value = "/ **", method = RequestMethod.GET) 컨트롤러가 있고 컨트롤러에 액세스하는 일부 URL의 경우 컨테이너에 404가 필요합니다.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.컨트롤러 메소드가 파일 처리와 같은 것을위한 것이라면, ResponseEntity는 매우 편리합니다 :

    컨트롤러 메소드가 파일 처리와 같은 것을위한 것이라면, ResponseEntity는 매우 편리합니다 :

    @Controller
    public class SomeController {
        @RequestMapping.....
        public ResponseEntity handleCall() {
            if (isFound()) {
                return new ResponseEntity(...);
            }
            else {
                return new ResponseEntity(404);
            }
        }
    }
    
  7. ==============================

    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. ==============================

    8.나는 HttpClientErrorException을 던지는 것을 권하고 싶다.

    나는 HttpClientErrorException을 던지는 것을 권하고 싶다.

    @RequestMapping(value = "/sample/")
    public void sample() {
        if (somethingIsWrong()) {
            throw new HttpClientErrorException(HttpStatus.NOT_FOUND);
        }
    }
    

    서블릿 출력 스트림에 무엇인가가 쓰여지 기 전에 만 할 수 있다는 것을 명심해야한다.

  9. ==============================

    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. ==============================

    10.조금 늦었지만 Spring Data REST를 사용하고 있다면 이미 org.springframework.data.rest.webmvc.ResourceNotFoundException이있다. 또한 @ResponseStatus 주석을 사용합니다. 더 이상 사용자 정의 런타임 예외를 만들 필요가 없습니다.

    조금 늦었지만 Spring Data REST를 사용하고 있다면 이미 org.springframework.data.rest.webmvc.ResourceNotFoundException이있다. 또한 @ResponseStatus 주석을 사용합니다. 더 이상 사용자 정의 런타임 예외를 만들 필요가 없습니다.

  11. ==============================

    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. ==============================

    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;
            }
    }
    
  13. from https://stackoverflow.com/questions/2066946/trigger-404-in-spring-mvc-controller by cc-by-sa and MIT license