Java 响应中的 JAX/Jersey 自定义错误代码
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2022007/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JAX/Jersey Custom error code in Response
提问by
In Jersey, how can we 'replace' the status string associated with a known status code?
在 Jersey 中,我们如何“替换”与已知状态代码关联的状态字符串?
e.g.
例如
return Response.status(401).build();
generates a HTTP response that contains:
生成包含以下内容的 HTTP 响应:
HTTP/1.1 401 Unauthorized
I (not me, but the client application) would like to see the response as:
我(不是我,而是客户端应用程序)希望看到响应为:
HTTP/1.1 401 Authorization Required
I tried the following approaches but in vain:
我尝试了以下方法但徒劳无功:
1) This just adds the String in the body of the HTTP response
1) 这只是在 HTTP 响应的正文中添加字符串
return Response.status(401).entity("Authorization Required").build();
2) Same result with this too:
2)与此相同的结果:
ResponseBuilder rb = Response.status(401);
rb = rb.tag("Authorization Required");
return rb.build();
Appreciate your help!
感谢你的帮助!
-spd
-spd
回答by jallch
To do this in Jersey you have the concept of WebApplicationException class. One method is to simply extend this class and all one of the methods to set the error text that is returned. In your case this would be:
要在 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());
}
}
Now in your code that implements the rest service you would simply throw a new exception of this type, passing in the text value in the constructor e.g.
现在,在实现其余服务的代码中,您只需抛出这种类型的新异常,在构造函数中传入文本值,例如
throw new UnauthorizedException("Authorization Required");
That can create a class like this for each of your web exceptions and throw in a similar fashion.
这可以为您的每个 Web 异常创建一个这样的类,并以类似的方式抛出。
This is also explained in the Jersey user guide - although the code is actually slightly incorrect:
这也在 Jersey 用户指南中进行了解释 - 尽管代码实际上有点不正确:
https://jersey.github.io/nonav/documentation/latest/user-guide.html/#d4e435
https://jersey.github.io/nonav/documentation/latest/user-guide.html/#d4e435
回答by Jin Kwon
I'm not sure JSR 339: JAX-RS 2.0: The Java API for RESTful Web Servicesalready covered this or not.
我不确定JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services 是否已经涵盖了这一点。
You might have to extend the Response.StatusTypefor this.
您可能需要为此扩展Response.StatusType。
public abstract class AbstractStatusType implements StatusType {
public AbstractStatusType(final Family family, final int statusCode,
final String reasonPhrase) {
super();
this.family = family;
this.statusCode = statusCode;
this.reasonPhrase = reasonPhrase;
}
protected AbstractStatusType(final Status status,
final String reasonPhrase) {
this(status.getFamily(), status.getStatusCode(), reasonPhrase);
}
@Override
public Family getFamily() { return family; }
@Override
public String getReasonPhrase() { return reasonPhrase; }
@Override
public int getStatusCode() { return statusCode; }
public ResponseBuilder responseBuilder() { return Response.status(this); }
public Response build() { return responseBuilder().build(); }
public WebApplicationException except() {
return new WebApplicationException(build());
}
private final Family family;
private final int statusCode;
private final String reasonPhrase;
}
And here are some extended statust types.
这里有一些扩展的状态类型。
public class BadRequest400 extends AbstractStatusType {
public BadRequest400(final String reasonPhrase) {
super(Status.BAD_REQUEST, reasonPhrase);
}
}
public class NotFound404 extends AbstractStatusType {
public NotFound404(final String reasonPhrase) {
super(Status.NOT_FOUND, reasonPhrase);
}
}
This is how I do.
这就是我的做法。
@POST
public Response create(final MyEntity entity) {
throw new BadRequest400("bad ass").except();
}
@GET
public MyEntity read(@QueryParam("id") final long id) {
throw new NotFound404("ass ignorant").except();
}
// Disclaimer
// I'm not a native English speaker.
// I don't know what 'bad ass' or 'ass ignorant' means.