JAX-RS和Jersey:SEVERE:响应的映射异常:501

时间:2011-08-18 18:36:35

标签: java jersey jax-rs

我们有一个JAX-RS资源方法来处理我们资源的GET请求。该GET方法目前尚未实现,我们希望返回一个响应代码。

我们最初使用以下技术生成501响应:

Response.status(501)

这会在我们的日志中产生严重警告(SEVERE:响应的映射异常:501),这是QA团队和我们的开发经理所不喜欢的。

以下是我们现在正在做的事情(避免警告):

public class JaxrsResponseStatus501NotImplemented implements StatusType {

public Family getFamily() {
    return Family.SERVER_ERROR;
}

public String getReasonPhrase() {
    return "Not Implemented";
}

public int getStatusCode() {
    return 501;
}

}

这在JAX-RS方法中:

public ResourceDto getResource(@PathParam("resource_id") String resourceId) {
    throw new WebApplicationException(Response.status(new JaxrsResponseStatus501NotImplemented()).entity(ERROR_MESSAGE_GET_NOT_IMPLEMENTED).build());
}

我的问题:

1)为什么没有定义Response.Status.NOT_IMPLEMENTED?大多数其他典型的响应被库定义为常量,但我没有在我使用的1.8版本中看到501预定义。

看到它是在ClientResponse.Status中定义的,但我的印象是com.sun.jersey.api.client包层次结构用于客户端开发。我甚至不认为我现在正在拉那个罐子。

2)发出501响应的正确方法是什么? 如果没有Response.Status.NOT_IMPLEMENTED(或任何其他没有预定义常量的响应),上面的方法(实现StatusType的自定义异常)是正确的方法吗?

3)当您实现StatusType(假设您需要)时,您如何知道将“异常”与“家庭”联系起来?家庭协会用于什么?他们在哪里使用?

谢谢!

3 个答案:

答案 0 :(得分:1)

就个人而言,我只是使用Response.status(501)继续生活。

更新:好吧,我不确定SEVERE的来源。我不知道我曾经见过它,但是如果你深入了解那种状态方法,你会发现它会像这样命中代码:

default: {
    return new StatusType() {
        @Override
        public int getStatusCode() {
            return statusCode;
        }

        @Override
        public Family getFamily() {
            return toFamilyCode(statusCode);
        }

        @Override
        public String getReasonPhrase() {
            return "";
        }
    };
}

和toFamilyCode()是

public static Family toFamilyCode(final int statusCode) {
    switch(statusCode / 100) {
        case 1: return Family.INFORMATIONAL;
        case 2: return Family.SUCCESSFUL;
        case 3: return Family.REDIRECTION;
        case 4: return Family.CLIENT_ERROR;
        case 5: return Family.SERVER_ERROR;
        default: return Family.OTHER;
    }
}

那应该给你一些指导。

答案 1 :(得分:0)

显然,创建自定义异常是必要的,以避免SEVERE日志警告。我遇到的一个未解决的问题是在501错误的自定义异常中用于家庭代码的内容。

快速检查Jersey客户端代码(奇怪的是,它定义了501状态响应)显示他们确定状态代码如下:

       Status(final int statusCode, final String reasonPhrase) {
        this.code = statusCode;
        this.reason = reasonPhrase;
        switch(code/100) {
            case 1: this.family = Family.INFORMATIONAL; break;
            case 2: this.family = Family.SUCCESSFUL; break;
            case 3: this.family = Family.REDIRECTION; break;
            case 4: this.family = Family.CLIENT_ERROR; break;
            case 5: this.family = Family.SERVER_ERROR; break;
            default: this.family = Family.OTHER; break;
        }
    }

将任何500系列错误放在Family.SERVER_ERROR类别中。仅供参考

答案 2 :(得分:0)

全部。我感到非常愚蠢。

我发布的解决方案创建自定义异常非常有用。但这完全是不必要的,并没有解决问题(日志中的严重警告)。

在使用泽西源(我本来应该首先完成)后花了一些时间,事实证明任何响应代码500或更高的异常都会发出该SEVERE异常。无论你如何将该状态代码放入异常中。

非常抱歉红鲱鱼。