springBoot(5) springBoot的/error的自定义处理

    在springboot项目里,如果没有统一异常处理,或者如果没有处理全面,又或者在springCloud zuul中调用微服务接口出错时,spring会自动把错误转发到默认给/error处理。

    正常情况下,可以配置错误页面来给用户提示错误,如404,500等。但是在前后分离项目中,可能更期望给前台返回一个特定格式的json来展示错误信息。所以可以用代码来自定义异常错误信息。


    /error 端 点 的 实现来源于 Spring Boot 的 org.springframework.boot.autoconfigure.web.BasicErrorController, 它的具体定义如下:

@RequestMapping
@ResponseBody
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    Map<String, Object> body = getErrorAttributes(request,isincludeStackTrace(request, MediaType.ALL)) ;
    HttpStatus status = getStatus(request);
    return new ResponseEntity<Map<String, Object>>(body, status);}

    通过调用 getErrorAtt豆butes 方法来根据请求参数组织错误信息的返回结果,而这里的 getErrorAtt豆bu七es 方法会将具体组织逻辑委托给 org.springframework.boot.autoconfigure.web.ErrorAttributes接口提供的 ge七ErrorAttributes 来实现。

    在 Spring Boot 的自动化配置机制中,默认会采用 org.springframework.boot.autoconfigure.web.DefaultErrorAttribut作为该接口的实现。

    在spring注册这个bean的时候,使用了注解@ConditionalOnMissingBean(value = ErrorAttributes.class, search =SearchStrategy.CURRENT)

    说明只有在不存在ErrorAttributes的bean的时候,才会使用DefaultErrorAttributes来处理,如果我们可以自定义一个,就可以使用我们的类来处理异常了。

    编写一个类继承DefaultErrorAttributes,他有三个方法:

  1. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex)
  2. public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace)
  3. public Throwable getError(RequestAttributes requestAttributes)

    他们的执行顺序就如上述顺序。

    我们可以在getErrorAttributes方法中拿到所有的异常信息,展示如下:

{"timestamp":1528190975129,"status":200,"error":"OK","exception":"java.lang.RuntimeException","message":"error............","path":"/a/b"}

    可以在resolveException中拿到异常信息,如果需要返回json,则可以利用response来输出到前台,比如:

    

/* 使用response返回 */
		response.setStatus(HttpStatus.OK.value()); // 设置状态码
		response.setContentType(MediaType.APPLICATION_JSON_VALUE); // 设置ContentType
		response.setCharacterEncoding("UTF-8"); // 避免乱码
		response.setHeader("Cache-Control", "no-cache, must-revalidate");

		try {
			response.getWriter().print("json..........");
			response.getWriter().flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				response.getWriter().close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
    这样,当有异常发生时,就可以在前台收到异常的json信息,而这个也可以代替统一异常处理使用。同时在springCloud zuul中可以用来自定义异常。


在Spring Boot中,你可以通过自定义`KafkaListenerErrorHandler`来处理连接Kafka失败时的情况,并执行自定义的代码。`KafkaListenerErrorHandler`是一个接口,你可以实现它并覆盖`handle(Exception ex, ConsumerRecord<?, ?> record)`方法来定义错误处理逻辑。 以下是一个示例代码: ```java @Component public class CustomKafkaListenerErrorHandler implements KafkaListenerErrorHandler { @Override public Object handleError(Message<?> message, ListenerExecutionFailedException exception, Consumer<?, ?> consumer) { // 处理连接Kafka失败的逻辑 // 可以执行自定义的代码,比如记录日志、发送通知等 // 返回一个用于处理错误消息的结果,可以是一个新的消息对象或者其他业务逻辑需要的返回值 return null; } @Override public Object handleError(Message<?> message, ListenerExecutionFailedException exception) { return handleError(message, exception, null); } } ``` 在上面的示例中,我们实现了`KafkaListenerErrorHandler`接口,并覆盖了`handleError()`方法来处理连接Kafka失败时的情况。你可以在该方法中编写自定义的错误处理逻辑,比如记录日志、发送通知等。最后,根据业务需求返回一个用于处理错误消息的结果。 接下来,你需要将自定义的错误处理器与`@KafkaListener`注解关联起来。可以在对应的消费者方法上使用`errorHandler`属性进行配置,指定使用哪个错误处理器。例如: ```java @KafkaListener(topics = "myTopic", errorHandler = "customKafkaListenerErrorHandler") public void listen(ConsumerRecord<?, ?> record) { // 消息处理逻辑 } ``` 在上面的示例中,我们将`errorHandler`属性设置为`"customKafkaListenerErrorHandler"`,这样当连接Kafka失败时,就会调用`CustomKafkaListenerErrorHandler`中定义的错误处理逻辑。 通过以上步骤,你可以在连接Kafka失败时执行自定义的代码,并进行相应的处理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值