我正在从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。
尽管已经回答了这个问题,但我不希望web.xml的答案对它无法在根资源下找到的资源产生任何影响。显然,抛出异常而不仅仅是返回404是正常行为,如接受的答案中所指出的那样。
答案 0 :(得分:2)
处理异常的默认行为是记录堆栈跟踪并使用包含状态代码和消息的HTML页面进行响应。用户确实获得了正确的HTTP状态代码,但在许多情况下,创建API时不需要错误页面。
如果您想提供处理任何异常的行为,则可能需要使用ExceptionMapper。
您可以通过为异常编写ExceptionMapper来覆盖Resteasy内置异常。就此而言,您可以为任何抛出的异常编写ExceptionMapper,包括WebApplicationException
答案 1 :(得分:1)
如果您要访问基础JPA实体管理器,则应使用AccountService
(或javax.enterprise.context.RequestScoped
等EJB注释)注释您的javax.ejb.Stateless
类。
HTH。