1

我已经定义了以下异常映射器来处理自定义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;
  }
}

当在代码中抛出 a时,我可以在 catalina.out 中看到方法HttpCustomNotAuthorizedException末尾定义的日志消息。toResponse因此,在请求处理期间调用了 HttpCustomExceptionMapper 类。但是,在最终响应中,我在客户端中看到,我只看到标准Not Authorized消息,而不是我在响应中设置的自定义消息。

为什么会这样?

4

2 回答 2

3

您应该注意当前版本的 HTTP 协议 (HTTP/2) 根本不支持原因短语。它已从协议中删除。

因此,从 Tomcat 9.0 起,对发送原因短语的支持已被删除。在 Tomcat 7.0 中,8.5 对发送自定义原因短语的支持默认关闭(可以使用系统属性,启用org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER)。在 8.5 中,您还应该设置sendReasonPhrase="true"一个Connector

于 2018-10-16T16:47:43.610 回答
1

它显示标准响应,因为您没有为响应设置正文,您只是在设置状态。您必须像这样传递自定义响应:

Response response = Response.status (Response.Status.INTERNAL_SERVER_ERROR).entity(CustomResponse).build ();

我对设计不好,但它会是这样的:

HttpCustomExceptionStatusType  status = new HttpCustomExceptionStatusType (Response.Status.INTERNAL_SERVER_ERROR, e.getMessage ())
Response response = Response.status (status).entity(status).build ();
于 2018-10-16T11:31:45.820 回答