我定义了以下异常映射器来处理自定义 HttpCustomException
HttpCustomException
package com.myapp.apis; import com.myapp.apis.model.HttpCustomException; import com.myapp.apis.model.HttpCustomExceptionStatusType; import com.myapp.apis.model.HttpCustomNotAuthorizedException; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider public class HttpCustomExceptionMapper implements ExceptionMapper <HttpCustomException> { @Override public Response toResponse (HttpCustomException e) { Response response = Response.status (new HttpCustomExceptionStatusType (Response.Status.UNAUTHORIZED, e.getMessage ())).build (); if (e instanceof HttpCustomNotAuthorizedException) { response = Response.status (new HttpCustomExceptionStatusType (Response.Status.INTERNAL_SERVER_ERROR, e.getMessage ())).build (); } System.out.println ("HttpCustomExceptionMapper: " + response.getStatus () + ", " + response.getStatusInfo ().getReasonPhrase ()); return response; } }
当HttpCustomNotAuthorizedException在代码中引发a时,我可以toResponse在catalina.out 中看到方法结尾定义的日志消息。因此,在请求处理期间将调用HttpCustomExceptionMapper类。但是,在最终响应中,我在客户端看到的是我只看到标准Not Authorized消息,而不是我在响应中设置的自定义消息。
HttpCustomNotAuthorizedException
toResponse
Not Authorized
为什么会这样?
您应该注意,当前版本的HTTP协议(HTTP / 2)完全不支持原因短语。它已从协议中删除。
因此,从Tomcat 9.0开始已删除了对发送原因短语的支持。在Tomcat中7.0,用于发送一个定制的原因短语8.5支持默认是关闭的(可与启用的系统属性,org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER)。在8.5,你还应该设置sendReasonPhrase="true"一个连接器。
org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER
sendReasonPhrase="true"