JAX-RS应用程序

时间:2017-06-09 07:43:57

标签: java jax-rs

我有以下问题:我已经创建了一个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错误页面。

1 个答案:

答案 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

处的Javadoc

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测试的。