Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 响应中的JAX/Jersey自定义错误代码_Java_Http_Jersey_Response - Fatal编程技术网

Java 响应中的JAX/Jersey自定义错误代码

Java 响应中的JAX/Jersey自定义错误代码,java,http,jersey,response,Java,Http,Jersey,Response,在泽西岛,我们如何“替换”与已知状态代码关联的状态字符串 e、 g 生成包含以下内容的HTTP响应: HTTP/1.1 401 Unauthorized 我(不是我,而是客户机应用程序)希望看到以下响应: HTTP/1.1 401 Authorization Required 我尝试了以下方法,但没有成功: 1) 这只是将字符串添加到HTTP响应的主体中 return Response.status(401).entity("Authorization Required").build();

在泽西岛,我们如何“替换”与已知状态代码关联的状态字符串

e、 g

生成包含以下内容的HTTP响应:

HTTP/1.1 401 Unauthorized
我(不是我,而是客户机应用程序)希望看到以下响应:

HTTP/1.1 401 Authorization Required
我尝试了以下方法,但没有成功:

1) 这只是将字符串添加到HTTP响应的主体中

return Response.status(401).entity("Authorization Required").build();
2) 这也是同样的结果:

ResponseBuilder rb = Response.status(401);
rb = rb.tag("Authorization Required");
return rb.build();
谢谢你的帮助


-spd

要在Jersey实现这一点,您需要WebApplicationException类的概念。一种方法是简单地扩展这个类和所有一种方法来设置返回的错误文本。在您的情况下,这将是:

import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.core.Response.*;


public class UnauthorizedException extends WebApplicationException {

    /**
      * Create a HTTP 401 (Unauthorized) exception.
     */
     public UnauthorizedException() {
         super(Response.status(Status.UNAUTHORIZED).build());
     }

     /**
      * Create a HTTP 404 (Not Found) exception.
      * @param message the String that is the entity of the 404 response.
      */
     public UnauthorizedException(String message) {
         super(Response.status(Status.UNAUTHORIZED).entity(message).type("text/plain").build());
     }

}
现在,在实现rest服务的代码中,您只需抛出这种类型的新异常,在构造函数中传递文本值,例如

throw new UnauthorizedException("Authorization Required");
这可以为每个web异常创建一个类似的类,并以类似的方式抛出

泽西岛用户指南中也解释了这一点-尽管代码实际上有点不正确:

我不确定是否已经讨论过这个问题

您可能必须为此扩展

公共抽象类AbstractStatusType实现StatusType{
公共抽象状态类型(最终族、最终int状态代码、,
最后一个字符串(短语){
超级();
这个家庭=家庭;
this.statusCode=状态码;
this.reasonPhrase=reasonPhrase;
}
受保护的AbstractStatusType(最终状态,
最后一个字符串(短语){
这(status.getFamily()、status.getStatusCode()、reasonPhase);
}
@凌驾
公共族getFamily(){return Family;}
@凌驾
公共字符串getReasonPhrase(){return reasonPhrase;}
@凌驾
public int getStatusCode(){return statusCode;}
public ResponseBuilder ResponseBuilder(){返回Response.status(this);}
公共响应生成(){return responseBuilder().build();}
公共WebApplicationException除外(){
返回新的WebApplicationException(build());
}
私人最终家庭;
专用最终int状态码;
私有最后字符串短语;
}
下面是一些扩展的statust类型

公共类BadRequest400扩展AbstractStatusType{
public BadRequest400(最后一个字符串){
super(Status.BAD_请求,reasonPhrase);
}
}
公共类NotFound404扩展了AbstractStatusType{
public NotFound404(最后一个字符串){
super(Status.NOT_FOUND,reasonPhrase);
}
}
我就是这样做的

@POST
公共响应创建(最终MyEntity实体){
抛出新的坏东西(“坏驴”)。除了();
}
@得到
公共MyEntity读取(@QueryParam(“id”)最终长id){
抛出newnotfound404(“愚蠢无知”)。除了();
}
//免责声明
//我不是以英语为母语的人。
//我不知道“坏屁股”或“无知屁股”是什么意思。

OP不是询问了除
实体(消息)
以外的其他方式吗?同意@JinKwon,这与OP问题中的1)有何不同?好吧,谢谢你让我看到状态有一个我可以处理的界面!这种方法似乎不适用于Jersey,因为它有一个类“com.sun.Jersey.core.spi.factory.ResponseImpl”,它有自己的逻辑来获取StatusType。
throw new UnauthorizedException("Authorization Required");