抛出javax.ws.rs.NotFoundException的服务未处理的路径

时间:2014-03-23 21:45:47

标签: jax-rs resteasy wildfly

我正在从Tomcat / Jersey向Wildfly / RESTEasy移植REST层。我只是开始隐藏REST层但它可以工作。到目前为止,我遇到的唯一问题是当我调用一个启动root api路径的无法处理的资源路径时。

例如:

http://localhost:8080/tmoi-0.0.1/api2/account

匹配我唯一的资源并返回一个有效的json对象。

http://localhost:8080/tmoi-0.0.1/notanapi

也表现得如预期的那样,因为它与@ApplicationPath("/api2")中设置的路径不匹配,因此返回404,其主体显示" Not Found"并且服务器上没有记录任何内容。但是:

http://localhost:8080/tmoi-0.0.1/api2/account2

匹配ApplicationPath但没有特定资源,最终在服务器上抛出此异常:

[0m[33m16:27:19,852 WARN  [org.jboss.resteasy.core.ExceptionHandler] (default task-9) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:8080/tmoi-0.0.1/api2/account2
    at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73) [resteasy-jaxrs-3.0.6.Final.jar:]
    at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) [resteasy-jaxrs-3.0.6.Final.jar:]
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:444) [resteasy-jaxrs-3.0.6.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234) [resteasy-jaxrs-3.0.6.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:171) [resteasy-jaxrs-3.0.6.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.6.Final.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.6.Final.jar:]

没有web.xml配置。我的Application课程看起来像这样。

@ApplicationPath("/api2")
public class TMOIApplication extends Application {
}

我的一个资源就是:

@Path("account")
@Produces(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class AccountService {
    @GET
    public NewAccount getAccount() {
        return new NewAccount("test");
    }

}

那么,为什么在拨打/api2/account2而不是仅仅返回正常的404时会出现异常?

更新

我在Quickstart示例Helloword-RS上对此进行了测试,并显示了相同的行为。我跑过这篇文章RESTEasy - @Path requiring a full path?,记录了类似的行为。我想我现在的问题是:

是否有NO-XML方法可以解决这个问题,或者我是否必须使用web.xml将参数传递给RESTEasy?

这是答案中引用的文档的最新link

更新2

尽管已经回答了这个问题,但我不希望web.xml的答案对它无法在根资源下找到的资源产生任何影响。显然,抛出异常而不仅仅是返回404是正常行为,如接受的答案中所指出的那样。

2 个答案:

答案 0 :(得分:2)

处理异常的默认行为是记录堆栈跟踪并使用包含状态代码和消息的HTML页面进行响应。用户确实获得了正确的HTTP状态代码,但在许多情况下,创建API时不需要错误页面。

如果您想提供处理任何异常的行为,则可能需要使用ExceptionMapper

来自Resteasy Documentation

  

您可以通过为异常编写ExceptionMapper来覆盖Resteasy内置异常。就此而言,您可以为任何抛出的异常编写ExceptionMapper,包括WebApplicationException

答案 1 :(得分:1)

如果您要访问基础JPA实体管理器,则应使用AccountService(或javax.enterprise.context.RequestScoped等EJB注释)注释您的javax.ejb.Stateless类。

HTH。