如何在Helidon MP v2.5.5中自定义401 Unauthorized响应体?
要给401响应添加时间戳和提示信息,你可以通过JAX-RS的ExceptionMapper机制来实现,具体步骤如下:
1. 定义错误响应DTO类
创建一个用于封装响应内容的Java类,用来序列化JSON格式的错误信息:
public class ErrorResponse { private long timestamp; private String message; public ErrorResponse(String message) { // 生成秒级时间戳,与示例格式匹配 this.timestamp = System.currentTimeMillis() / 1000; this.message = message; } // 必须提供getter方法,Jackson序列化需要访问字段 public long getTimestamp() { return timestamp; } public String getMessage() { return message; } }
2. 实现ExceptionMapper捕获401异常
创建一个带有@Provider注解的异常映射器类,用来拦截401相关的异常并返回自定义响应:
方式一:通用拦截WebApplicationException(覆盖所有401场景)
import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider public class UnauthorizedResponseMapper implements ExceptionMapper<WebApplicationException> { @Override public Response toResponse(WebApplicationException exception) { Response originalResponse = exception.getResponse(); // 判断是否为401状态码 if (originalResponse.getStatus() == Response.Status.UNAUTHORIZED.getStatusCode()) { // 自定义提示信息,可根据异常动态调整 String errorMsg = "Your access token was expired"; ErrorResponse errorResponse = new ErrorResponse(errorMsg); return Response.status(Response.Status.UNAUTHORIZED) .entity(errorResponse) .type(MediaType.APPLICATION_JSON) .build(); } // 非401异常按原有逻辑返回 return originalResponse; } }
方式二:精准拦截Helidon认证异常(针对安全模块触发的401)
如果你的401是由Helidon Security模块的认证失败触发的,可以直接拦截AuthenticationException,更精准:
import io.helidon.security.AuthenticationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider public class AuthExceptionResponseMapper implements ExceptionMapper<AuthenticationException> { @Override public Response toResponse(AuthenticationException exception) { // 优先使用异常自带的消息,没有则用默认提示 String errorMsg = exception.getMessage() != null ? exception.getMessage() : "Your access token was expired"; ErrorResponse errorResponse = new ErrorResponse(errorMsg); return Response.status(Response.Status.UNAUTHORIZED) .entity(errorResponse) .type(MediaType.APPLICATION_JSON) .build(); } }
3. 生效机制
Helidon MP会自动扫描带有@Provider注解的类并注册为JAX-RS组件,无需额外配置。当系统触发401异常时,就会自动使用你定义的响应格式返回。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

