복붙노트

[SPRING] 어떻게하면 봄 부팅 / mvc에서 오류 처리기 (404, 500 ...)를 만들 수 있습니까?

SPRING

어떻게하면 봄 부팅 / mvc에서 오류 처리기 (404, 500 ...)를 만들 수 있습니까?

몇 시간 동안 봄 부팅 / MVC에서 사용자 지정 전역 오류 처리기를 만들려고합니다. 나는 많은 기사와 아무것도 읽지 않았다 ... : / 제발. 도와주세요.

그건 내 오류 클래스입니다 :

나는 그런 수업을 만들려고 했어.

@Controller
public class ErrorPagesController {

    @RequestMapping("/404")
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String notFound() {
        return "/error/404";
    }

    @RequestMapping("/403")
    @ResponseStatus(HttpStatus.FORBIDDEN)
    public String forbidden() {
        return "/error/403";
    }

    @RequestMapping("/500")
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String internalServerError() {
        return "/error/500";
    }

}

**** QUESTION SOLVED **** 나는이 방법을 사용했습니다 :

`

@Configuration
public class ErrorConfig implements EmbeddedServletContainerCustomizer {
    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
    }
}

`

해결법

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

    1.다음 코드를 사용해보십시오 :

    다음 코드를 사용해보십시오 :

    @ControllerAdvice
    public class ExceptionController {
        @ExceptionHandler(Exception.class)
        public ModelAndView handleError(HttpServletRequest request, Exception e)   {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Request: " + request.getRequestURL() + " raised " + e);
            return new ModelAndView("error");
        }
    
        @ExceptionHandler(NoHandlerFoundException.class)
        public ModelAndView handleError404(HttpServletRequest request, Exception e)   {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Request: " + request.getRequestURL() + " raised " + e);
            return new ModelAndView("404");
        }
    }
    
  2. ==============================

    2.@Arash에 추가 예외에서 http 응답으로의 변환을 처리 할 수있는 확장 가능한 새로운 BaseController 클래스를 추가 할 수 있습니다.

    @Arash에 추가 예외에서 http 응답으로의 변환을 처리 할 수있는 확장 가능한 새로운 BaseController 클래스를 추가 할 수 있습니다.

         import com.alexfrndz.pojo.ErrorResponse;
         import com.alexfrndz.pojo.Error;
         import com.alexfrndz.pojo.exceptions.NotFoundException;
         import org.springframework.http.HttpStatus;
         import org.springframework.http.ResponseEntity;
         import org.springframework.web.bind.annotation.ExceptionHandler;
         import org.springframework.web.bind.annotation.ResponseBody;
         import org.springframework.web.bind.annotation.ResponseStatus;
    
         import javax.persistence.NoResultException;
         import javax.servlet.http.HttpServletRequest;
         import java.util.List;
    
         @Slf4j
         public class BaseController {
    
        @ExceptionHandler(NoResultException.class)
        public ResponseEntity<Exception> handleNoResultException(
                NoResultException nre) {
            log.error("> handleNoResultException");
            log.error("- NoResultException: ", nre);
            log.error("< handleNoResultException");
            return new ResponseEntity<Exception>(HttpStatus.NOT_FOUND);
        }
    
    
        @ExceptionHandler(Exception.class)
        public ResponseEntity<Exception> handleException(Exception e) {
            log.error("> handleException");
            log.error("- Exception: ", e);
            log.error("< handleException");
            return new ResponseEntity<Exception>(e,
                    HttpStatus.INTERNAL_SERVER_ERROR);
        }
    
        @ExceptionHandler(NotFoundException.class)
        @ResponseStatus(value = HttpStatus.NOT_FOUND)
        @ResponseBody
        public ErrorResponse handleNotFoundError(HttpServletRequest req, NotFoundException exception) {
            List<Error> errors = Lists.newArrayList();
            errors.add(new Error(String.valueOf(exception.getCode()), exception.getMessage()));
            return new ErrorResponse(errors);
        }
       }
    
  3. ==============================

    3.봄 부팅 용 업데이트

    봄 부팅 용 업데이트

    사용자 정의 오류 페이지

    주어진 상태 코드에 대해 사용자 정의 HTML 오류 페이지를 표시하려면 / error 폴더에 파일을 추가하십시오. 오류 페이지는 정적 HTML (정적 리소스 폴더 아래에 추가됨)이거나 템플릿을 사용하여 빌드 될 수 있습니다. 파일의 이름은 정확한 상태 코드 또는 시리즈 마스크 여야합니다.

    예를 들어 404를 정적 HTML 파일에 매핑하려면 폴더 구조가 다음과 같이 표시됩니다

    src/
     +- main/
         +- java/
         |   + <source code>
         +- resources/
             +- public/
                 +- error/
                 |   +- 404.html
                 +- <other public assets>
    

    출처

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

    4.희망이 도움이 될 것입니다 : 클래스를 생성하면 런타임 예외를 확장하는 NoProductsFoundException이 발생합니다.

    희망이 도움이 될 것입니다 : 클래스를 생성하면 런타임 예외를 확장하는 NoProductsFoundException이 발생합니다.

        import org.springframework.http.HttpStatus;
        import org.springframework.web.bind.annotation.ResponseStatus;
    
        @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No products found under this category")
        public class NoProductsFoundException extends RuntimeException{
    
        private static final long serialVersionUID =3935230281455340039L;
        }
    

    그런 다음 productcontroller에서 :

        @RequestMapping("/{category}")
        public String getProductsByCategory(Model
        model,@PathVariable("category") String category) {
    
       List<Product> products = productService.getProductsByCategory(category);
    
       if (products == null || products.isEmpty()) {
       throw new NoProductsFoundException ();
       }
       model.addAttribute("products", products);
       return "products";
    }
    

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

    5.

    @ControllerAdvice
     public class ErrorHandler {
    
    public RestErrorHandler() {
    }
    
    @ExceptionHandler(YourException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public XXX processException(Exception ex){}
    

    이런 수업이 필요해. 각 예외에 대한 메소드를 추가하고 주석 달기 - @ResponseBody 등

  6. from https://stackoverflow.com/questions/38777723/how-i-create-an-error-handler-404-500-in-spring-boot-mvc by cc-by-sa and MIT license