我有一个与 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
Also <baseurl>/rest/service/area?length=10&breadth20
将正确返回其输出。
我的要求是当有人打<baseurl>/rest/service/volume
它应该输出像
Service is unavailable message.
由于仅area
可用 我该怎么做。请帮忙..(当前显示 404 错误)
JAX-RS(泽西岛)将抛出一个NotFoundException
如果找不到资源。此异常将映射到包含状态代码 404 Not Found(没有实体正文)的响应,因为这是正常的 REST 行为。但我们也可以根据自己的喜好更改响应,方法是创建一个ExceptionMapper https://jersey.java.net/apidocs/2.7/jersey/javax/ws/rs/ext/ExceptionMapper.html。在那里我们可以设置一个实体主体。你可能有类似的东西
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
).
看来只要我们有一个带有响应的实体主体,我们就会得到
代替
- 请参阅异常映射 https://jersey.java.net/documentation/latest/representations.html#d0e5207
-
注意:您可以通过 web.xml 轻松地将 404 映射到您选择的错误页面,而不需要任何 ExceptionMapper。就像是
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
请参阅此处了解更多详情 https://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1017571
UPDATE
“当我设置它时,还有一个疑问,对于所有 404 相同的消息。我们是否也可以基于请求 url 或其他方式进行自定义。(我的目的是为不同的服务提供不同的消息)”
您可以将不同的上下文注入到ExceptionMapper
。例如UriInfo https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/UriInfo.html,并获取请求的路径
@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
- 可能更多:-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)