我有以下问题:我已经创建了一个Java Web应用程序。另外,我做了一些REST端点。在web.xml中,我使用标记为404错误定义了重定向。除了不存在的REST端点之外,它适用于所有地址。我实现了RestApplication类:
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("rest")
public class RestApplication extends Application {
}
和一个端点myView:
@Path("/myView")
public class MyView {
@GET
@Path("/")
public Response myViewPage() {
//some code goes here...
}
}
现在,当我尝试进入不存在的端点时,让我们说“aaa”,即我输入地址:http://localhost:8080/mysite/rest/aaa,我得到404错误,但重定向不起作用。对于非REST地址,例如:http://localhost:8080/mysite/somesitethatdoesnotexist,重定向可正常工作。我的web.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>resteasy.document.expand.entity.references</param-name>
<param-value>false</param-value>
</context-param>
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>welcome.xhtml</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/errorpages/404.xhtml</location>
</error-page>
<security-constraint>
<web-resource-collection>
<web-resource-name>restricted methods</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>HEAD</http-method>
</web-resource-collection>
<auth-constraint />
</security-constraint>
</web-app>
我也尝试使用ExceptionMapper,即我实现了EntityNotFoundExceptionMapper类:
@Provider
public class EntityNotFoundExceptionMapper implements ExceptionMapper<NotFoundException> {
@Override
public Response toResponse(NotFoundException ex) {
// some code for redirect
}
}
并将其添加到RestApplication类:
@ApplicationPath("rest")
public class RestApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(EntityNotFoundExceptionMapper.class);
return s;
}
}
但它不起作用。但是,当我删除了:
时,它有效
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/errorpages/404.xhtml</location>
</error-page>
来自web.xml。但是,遗憾的是,重定向当然不适用于非REST地址。
任何人都可以帮我解决这个问题,并提出一个解决方案,允许我在REST和非REST地址都出现404错误的情况下提供重定向吗?提前谢谢!
修改
根据@andih的注释,对于REST服务,我想在资源不可用的情况下返回配置的404错误页面。
答案 0 :(得分:2)
不完全确定为什么要找到您的其他资源,但对于web.xml
和Annotations工作的复杂部署,您必须多做一些。
您的RestApplication
类必须扩展javax.ws.rs.core.Application
以定义RESTful Web服务应用程序部署的组件。有关javax.ws.rs.core.Application
的详细信息,请参阅http://download.oracle.com/javaee/6/api/javax/ws/rs/core/Application.html
在Application
子类中,您必须根据需要覆盖getClasses()
或getSingletons()
方法,以返回RESTful Web服务资源列表。
例如
@ApplicationPath("/rest")
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(HelloResource.class);
return s;
}
}
使用Hello REST资源。
@Path("/hello")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getHello() {
return "Hello!";
}
}
在web.xml
中,您必须定义REST应用程序。
如果需要,您可以配置多个。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<!-- The servlet name is the full qualified name of your rest application it must be a subclass of java.ws.rs.Application -->
<servlet-name>org.example.restexample.RestApplication</servlet-name>
<!--servlet-class is not needed -->
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<!-- As init parameter pass the full qualified name of the java.ws.rs.Application subclass -->
<param-value>org.example.restexample. RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- other servlet definitions -->
<--servlet mapping -->
<error-page>
<error-code>404</error-code>
<location>/NotFound.html</location>
</error-page>
</web-app>
您可以为JaxRS应用程序指定servlet映射。如果您这样做,<servlet-mapping>
将优先。
如果资源类似,上面的示例将返回配置的404错误页面 请求“... / rest / foo”,其中“... / rest / hello”返回“Hello”。
上面的例子是用球衣2.26-b03和tomcat 8.5.15测试的。