我们有一个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(假设您需要)时,您如何知道将“异常”与“家庭”联系起来?家庭协会用于什么?他们在哪里使用?
谢谢!
答案 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异常。无论你如何将该状态代码放入异常中。
非常抱歉红鲱鱼。