解决拦截器抛出异常处理类的500状态码Html默认格式响应 !

解决方式

<mvc:annotation-driven>
        <mvc:message-converters>
            <!-- 配置JSON消息转换器 -->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

将Java对象转换为JSON格式的响应,使用spring-mvc.xml配置适当的消息转换器。

问题出处的相关类如下

interceptor如下

package com.ekgc.interceptor;

import com.ekgc.exception.UnLoginException;
import com.ekgc.pojo.SysUser;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 登录拦截器
 * 1.实现 HandlerInterceptor接口
 * 2.实现接口方法
 * 3.在springmvc.xml中配置拦截器
 * @author Magic
 * @version 1.0
 */
public class LoginInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("preHandle...");
		// 记录请求处理开始时间
		request.setAttribute("startTime", System.currentTimeMillis());

		// 检查用户是否已经登录
		if (!isLoggedIn(request)) {
			//抛出未登录异常
			throw new UnLoginException("您还没有登录!!!");
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle...");
		// 计算请求处理时间
		long startTime = (long) request.getAttribute("startTime");
		long endTime = System.currentTimeMillis();
		long executionTime = endTime - startTime;

		System.out.println("Request execution time: " + executionTime + " ms");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("afterCompletion...");
	}

	private boolean isLoggedIn(HttpServletRequest request) {
		// 检查用户是否已登录的逻辑
		HttpSession session = request.getSession();
		SysUser user = (SysUser) session.getAttribute("user");
		// 返回true表示已登录,false表示未登录
		if (user == null) {
			return false;
		}
		return true;
	}
}

 自定义异常类

package com.ekgc.exception;

/**
 * @author Magic
 * @version 1.0
 */
public class UnLoginException extends RuntimeException{
    public UnLoginException(String message) {
        super(message);
    }
}

 异常处理类

package com.ekgc.exception;

import com.ekgc.response.RespBody;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;



/**
 * 登录异常处理类
 * @author Magic
 * @version 1.0
 */
@ControllerAdvice
public class LoginExceptionHandler {

    @ExceptionHandler(UnLoginException.class)
    @ResponseBody
    public RespBody<String> loginExceptionHandler(UnLoginException e) {
        String message = e.getMessage();
        System.out.println(message);
        return new RespBody<String>(-1,message,message);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过编写一个响应拦截器来实现这个功能。首先,您需要创建一个来表示错误响应: ```java public class ErrorResponse { private int code; private String message; // getters and setters } ``` 然后,您可以编写一个响应拦截器来检查响应是否成功并将响应转换为实体抛出异常: ```java public class CustomResponseInterceptor implements ResponseInterceptor { @Override public void onException(FeignException e, Request request) { throw e; // rethrow the exception } @Override public void onSuccessfulResponse(Response response, Request request) { if (response.status() >= 200 && response.status() < 300) { // response is successful, convert to entity response.body(MyEntity.class) } else { // response is not successful, throw exception ErrorResponse errorResponse = response.body(ErrorResponse.class); throw new MyFeignException(errorResponse.getCode(), errorResponse.getMessage()); } } } ``` 在上面的代码中,我们首先检查响应状态码是否为成功状态码(在这里,我们使用了 200 到 299 之间的状态码)。如果响应是成功的,我们可以使用 `response.body()` 方法将响应转换为实体。如果响应不成功,则使用相同的方法将响应转换为 `ErrorResponse` 对象,并使用该对象的信息抛出自定义的 `MyFeignException` 异常。 最后,您可以将此响应拦截器添加到您的 `Feign` 客户端中: ```java MyClient myClient = Feign.builder() .client(new OkHttpClient()) .errorDecoder(new MyFeignErrorDecoder()) .addInterceptor(new CustomResponseInterceptor()) .target(MyClient.class, "https://myapi.com"); ``` 在上面的代码中,我们使用 `addInterceptor()` 方法添加响应拦截器。请注意,如果您还需要添加其他拦截器,您可以在此处添加它们。最后,您可以使用 `target()` 方法创建一个 `MyClient` 实例,并将其用于调用 API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值