복붙노트

[SPRING] Spring MVC : 맞춤 404 오류 페이지를 반환하는 방법?

SPRING

Spring MVC : 맞춤 404 오류 페이지를 반환하는 방법?

내가 요청한 리소스를 찾을 수 없을 때 봄 4 맞춤 404 오류 페이지를 반환하는 깨끗한 방법을 찾고 있어요. 다른 도메인 유형에 대한 조회는 다른 오류 페이지를 야기합니다.

여기 내 의도를 보여주는 몇 가지 코드 (Meter는 도메인 클래스 임) :

@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model) {
    final Meter result = meterService.findOne(number);
    if (result == null) {
        // here some code to return an errorpage
    }

    model.addAttribute("meter", result);
    return "meters/details";
}

나는이 문제를 다루는 몇 가지 방법을 상상한다. 먼저 RuntimeExceptions를 생성 할 가능성이 있습니다.

@ResponseStatus(HttpStatus.NOT_FOUND)
public class MeterNotFoundExcption extends RuntimeException { }

그런 다음 예외 처리기를 사용하여 사용자 정의 오류 페이지를 렌더링합니다 (아마도 미터 목록이나 적절한 항목에 대한 링크가 포함될 수 있습니다).

하지만 나는 작은 예외를 제외하고는 내 응용 프로그램을 오염시키는 것을 좋아하지 않습니다.

또 다른 가능성은 HttpServletResponse를 사용하고 상태 코드를 수동으로 설정하는 것입니다.

@RequestMapping(value = "/{number}", method = RequestMethod.GET)
public String getMeterDetails(@PathVariable("number") final Long number, final Model model,
final HttpServletResponse response) {
    final Meter meter = meterService.findOne(number);
    if (meter == null) {
        response.setStatus(HttpStatus.NOT_FOUND.value());
        return "meters/notfound";
    }

    model.addAttribute("meter", meter);
    return "meters/details";
}

하지만이 솔루션을 사용하면 많은 컨트롤러 메소드 (편집, 삭제 등)의 처음 5 행을 복제해야합니다.

이 줄을 여러 번 복제하지 못하게하는 우아한 방법이 있습니까?

해결법

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

    1.해결책은 생각보다 훨씬 간단합니다. 다음과 같이 정의 된 하나의 일반 ResourceNotFoundException을 사용할 수 있습니다.

    해결책은 생각보다 훨씬 간단합니다. 다음과 같이 정의 된 하나의 일반 ResourceNotFoundException을 사용할 수 있습니다.

    public class ResourceNotFoundException extends RuntimeException { }
    

    ExceptionHandler 어노테이션을 사용하여 모든 컨트롤러 내에서 오류를 처리 할 수 ​​있습니다.

    class MeterController {
        // ...
        @ExceptionHandler(ResourceNotFoundException.class)
        @ResponseStatus(HttpStatus.NOT_FOUND)
        public String handleResourceNotFoundException() {
            return "meters/notfound";
        }
    
        // ...
    
        @RequestMapping(value = "/{number}/edit", method = RequestMethod.GET)
        public String viewEdit(@PathVariable("number") final Meter meter,
                               final Model model) {
            if (meter == null) throw new ResourceNotFoundException();
    
            model.addAttribute("meter", meter);
            return "meters/edit";
        }
    }
    

    모든 컨트롤러는 ResourceNotFoundException에 대해 자체 ExceptionHandler를 정의 할 수 있습니다.

  2. ==============================

    2.web.xml 파일을 수정했습니다. 다음 코드를 사용하십시오.

    web.xml 파일을 수정했습니다. 다음 코드를 사용하십시오.

    <display-name>App Name </display-name>
    <error-page>
    <error-code>500</error-code>
    <location>/error500.jsp</location>
    </error-page>
    
    <error-page>
    <error-code>404</error-code>
    <location>/error404.jsp</location>
    </error-page>
    

    다음 코드에 따라 액세스하십시오.

    response.sendError(508802,"Error Message");
    

    이제이 코드를 web.xml에 추가하십시오.

    <error-page>
    <error-code>508802</error-code>
    <location>/error500.jsp</location>
    </error-page>
    
  3. ==============================

    3.web.xml의 오류 코드는 다음과 같이 매핑 할 수 있습니다.

    web.xml의 오류 코드는 다음과 같이 매핑 할 수 있습니다.

        <error-page>
            <error-code>400</error-code>
            <location>/400</location>
        </error-page>
    
        <error-page>
            <error-code>404</error-code>
            <location>/404</location>
        </error-page>
    
        <error-page>
            <error-code>500</error-code>
            <location>/500</location>
        </error-page>
    

    이제 이러한 오류가 발견 될 때 적중 된 URL을 매핑하는 컨트롤러를 만들 수 있습니다.

    @Controller
    public class HTTPErrorHandler{
    
        String path = "/error";
    
        @RequestMapping(value="/404")
        public String error404(){
           // DO stuff here 
            return path+"/404";
        }
        }
    

    전체 예제는이 튜토리얼을 참조하십시오.

  4. ==============================

    4.Spring MVC 프로젝트에서 예외 처리에 대한 자세한 정보를 찾을 수있는이 기사를 따라야한다.

    Spring MVC 프로젝트에서 예외 처리에 대한 자세한 정보를 찾을 수있는이 기사를 따라야한다.

    봄 - mvc - 예외 처리

    이 경우 @ControllerAdvice가 도움이 될 수 있습니다.

  5. ==============================

    5.web.xml 파일에 다음 코드 행을 추가하고 프로젝트의 루트 디렉토리에 errorPage.jsp라는 새 jsp 파일을 도입하여 요구 사항을 완료 할 수 있습니다.

    web.xml 파일에 다음 코드 행을 추가하고 프로젝트의 루트 디렉토리에 errorPage.jsp라는 새 jsp 파일을 도입하여 요구 사항을 완료 할 수 있습니다.

    <error-page>
        <error-code>400</error-code>
        <location>/errorPage.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/errorPage.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/errorPage.jsp</location>
    </error-page>
    
  6. ==============================

    6.100 % 무료 xml에 대한 간단한 대답 :

    100 % 무료 xml에 대한 간단한 대답 :

    그게 다야.

  7. ==============================

    7.org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer도 사용하지 않아야했습니다.

    org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer도 사용하지 않아야했습니다.

    org.springframework.web.servlet.DispatcherServlet.setThrowExceptionIfNoHandlerFound (boolean)에 따르면 : "DefaultServletHttpRequestHandler가 사용되면 요청은 항상 기본 서블릿으로 전달되며이 경우 NoHandlerFoundException은 절대로 발생하지 않습니다."

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html#setThrowExceptionIfNoHandlerFound-boolean-

    전에

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.foo.web")
    public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
    
      @Override
      public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
      }
    
      // ...
    }
    

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.foo.web")
    public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
    
      @Override
      public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
      }
    
      // ...
    }
    
  8. from https://stackoverflow.com/questions/21061638/spring-mvc-how-to-return-custom-404-errorpages by cc-by-sa and MIT license