数時間、私はSpring Boot/MVCでCUSTOMグローバルエラーハンドラを作成しようとしています。私はたくさんの記事を読みましたが、何もありません...:/お願いします。助けて。
それが私のエラークラスです:
私はそのようなクラスを作成しようとしました
@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";
}
}
****解決済みの質問****私はこの方法を使用しました:
`
@Configuration
public class ErrorConfig implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
}
}
`
次のコードを試すことができます。
@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");
}
}
@ Arashへの追加例外からhttp response
への変換を処理する、拡張可能な新しい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);
}
}
スプリングブートの更新
カスタムエラーページ
特定のステータスコードのカスタムHTMLエラーページを表示する場合は、/ errorフォルダーにファイルを追加します。エラーページは、静的HTML(つまり、任意の静的リソースフォルダーの下に追加)またはテンプレートを使用して作成できます。ファイルの名前は、正確なステータスコードまたはシリーズマスクである必要があります。
たとえば、404を静的なHTMLファイルにマッピングするには、フォルダー構造は次のようになります
src/
+- main/
+- Java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
@ControllerAdvice
public class ErrorHandler {
public RestErrorHandler() {
}
@ExceptionHandler(YourException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public XXX processException(Exception ex){}
このようなクラスが必要です。各例外にメソッドを追加し、必要に応じて注釈を付けます-@ResponseBodyなど.
これが役立つことを願っています:クラスを作成します:runtimexceptionを拡張する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;
}
次に、製品コントローラーで:
@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";
}