我有一个与Spring集成的泽西RESTful服务。在web.xml中映射的基本网址为/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.
由于只有area
可用,我该怎么办。请帮助..(目前显示404错误)
答案 0 :(得分:3)
如果找不到资源,JAX-RS(泽西岛)将抛出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.stackoverflow.com'>"
+ "Check out Stackoverflow</a>";
@Override
public Response toResponse(NotFoundException e) {
return Response.status(Status.NOT_FOUND)
.entity(html).build();
}
}
我们只需要使用Jersey(JAX-RS)应用程序(可能通过ResourceConfig
)注册此提供程序。
似乎只要我们有一个具有响应的实体主体,我们就会得到
而不是
注意:您可以通过web.xml轻松地将404映射到您选择的错误页面,而无需任何ExceptionMapper。像
这样的东西<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
&#34;当我设置它时,再次怀疑所有404相同的消息。我们可以根据请求网址或其他方式进行自定义。(我的目的是为不同的服务提供不同的信息)&#34;
您可以将不同的上下文注入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.stackoverflow.com'>"
+ "Check out Stackoverflow</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