java-如何使用Jersey REST处理服务不可用的情况

我有一个与Spring集成的球衣RESTful服务.web.xml中映射的基本URL是/ rest / *
我的服务类别如下:

@Resource
@Scope("request")
@Path("/service/")
@Component
public class ServiceController {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getApiDetails() {
        return Response.ok("area").build();
    }

    @Path("/area")
    @GET
    @Consumes({ MediaType.APPLICATION_JSON })
    @Produces(MediaType.APPLICATION_JSON)
    public Response processConvertCurrency(
        @QueryParam("length") String length,
        @QueryParam("breadth") String breadth) {
        ......
    }
}

当以下网址被点击时,它将显示可用的服务

<baseurl>/rest/service

output : area

< baseurl> / rest / service / area?length = 10& breadth20也会正确返回其输出.

我的要求是,当有人点击< baseurl> / rest / service / volume时,其输出应为

Service is unavailable message.

由于只有区域可用,我该怎么办.请提供帮助.(当前显示404错误)

解决方法:

如果找不到资源,则JAX-RS(Jersey)将抛出NotFoundException.此异常将映射到包含状态代码404 Not Found(没有实体主体)的响应,因为这是正常的REST行为.但是我们也可以通过创建一个ExceptionMapper来更改对自己喜欢的响应.在这里我们可以设置实体主体.你可能会喜欢

import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class NotFoundExceptionMapper
        implements ExceptionMapper<NotFoundException> {
    final String html
            = "<p style='font-size:20px;font-family:Sans-serif'>"
            + "Service is unavailable message."
            + "</p>"
            + "<a href='http://www.*.com'>"
            + "Check out *</a>";

    @Override
    public Response toResponse(NotFoundException e) {
        return Response.status(Status.NOT_FOUND)
                .entity(html).build();
    }
}

我们只需要在Jersey(JAX-RS)应用程序中注册此提供程序(可能通过ResourceConfig).

看起来只要我们有一个带有响应的实体,我们就会得到

代替

> See Exception Mapping
>注意:您可以通过web.xml轻松地将404映射到您选择的错误页面,而无需任何ExceptionMapper.就像是

<error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
</error-page>

See here for more details

更新

“One more doubt, when I set it, for all 404 same message. Can we customize too based on the request url or some otherway.(My intention is to provide different message for different services)”

您可以将不同的上下文注入ExceptionMapper.例如UriInfo,并获取请求的路径

@Context
UriInfo uriInfo;

@Override
public Response toResponse(NotFoundException e) {
    String html
        = "<p style='font-size:20px;font-family:Sans-serif'>"
        + "Service is unavailable message."
        + "</p>"
        + "<a href='http://www.*.com'>"
        + "Check out *</a>";
    html += "<p>Requested URI: " + uriInfo.getAbsolutePath() + "</p>";
    return Response.status(Status.NOT_FOUND)
            .entity(html).build();
}

可以注入其他上下文.它们是否可注入到类中取决于类(资源类/提供者类)及其应用范围(除其他外).但这是可注入上下文的列表(带有@Context批注).

> javax.ws.rs.core.HttpHeaders
> javax.ws.rs.core.UriInfo
> javax.ws.rs.core.Request
> javax.servlet.HttpServletRequest
> javax.servlet.HttpServletResponse
> javax.servlet.ServletConfig
> javax.servlet.ServletContext
> javax.ws.rs.core.SecurityContext
>可能更多:-)

上一篇:java-XMLRootElement在jersey中将类转换为XML


下一篇:java-无法使用Servlet 3可插入性功能将Jersey 2.16集成到Tomcat 8.0.12中