javax.ws.rs.NotFoundException:使用RESTEasy和Wildfly 8.1.0.Final找不到完整路径的资源

我面临以下问题。 我已经花了3天多的时间,但找不到解决方案。 请指导我在这里做错了什么。 我是野生蝇新来的Resteasy。

这是堆栈跟踪

19:05:57,610 WARN [org.jboss.resteasy.core.ExceptionHandler] (default task-14) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:8080/admin-ws/services/user/getUser at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:444) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:171) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.8.Final.jar:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.Connectors.executeRootHandler(Connectors.java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_20] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_20] at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_20] 

这是我的web.xml

    

这是Application类。

 package com.abc.admin.services.config; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/services") public class WebConfig extends Application { } 

这是Web服务类。

 package com.abc.admin.service; import java.io.Serializable; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.abc.commons.ws.entity.UserWsPojo; @Path("/user") public class UserResource implements Serializable { private static final long serialVersionUID = 6766329501327292893L; @GET @Path("/services/user/getUser") @Produces(MediaType.APPLICATION_JSON) public UserWsPojo getUser(String id) { UserWsPojo uwp = new UserWsPojo(); uwp.setName("Aayush"); uwp.setSurname("Devmurari"); return uwp; } } 

现在在上面提到的类中我也尝试使用/ getUser更改@Path的路径,并尝试完整路径,即@Path(“/ services / user / getUser”),每当我得到相同的错误时,这些都不起作用。

如果您需要查看其他内容,请告诉我们。 我会在这里发布。

感谢阅读和帮助。

PS我试过阅读其他关于SO的问题,关于RestEasy的文档这些对我没什么帮助。 但是,我在寻找解决方案时更正了我的代码。

根据答案,我也这样做了

 @Path("/user") public class UserResource implements Serializable { private static final long serialVersionUID = 6766329501327292893L; @GET @Path("/getUser") @Produces(MediaType.APPLICATION_JSON) public UserWsPojo getUser() { UserWsPojo uwp = new UserWsPojo(); uwp.setName("Aayush"); uwp.setSurname("Devmurari"); return uwp; } } 

其他的东西都是一样的,我仍然得到同样的错误。

 22:15:58,489 WARN [org.jboss.resteasy.core.ExceptionHandler] (default task-5) failed to execute: javax.ws.rs.NotFoundException: Could not find resource for full path: http://localhost:8080/admin-ws/services/user/getUsers at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:444) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:171) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.8.Final.jar:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.Connectors.executeRootHandler(Connectors.java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_20] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_20] at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_20] 

  • 基础:

     (1) http://localhost:8080/admin-ws (I assume `admin-ws` is the app name) 
  • @ApplicationPath("/services") ==追加/servicesBase

     (2) http://localhost:8080/admin-ws/services 
  • @Path("/user") ==将/user附加到上一个

     (3) http://localhost:8080/admin-ws/services/user 
  • @Path("/services/user/getUser") ==追加/services/user/getUser到previous

     (4) http://localhost:8080/admin-ws/services/user/services/user/getUser //This is the winner with your current set up 
  • 你在用什么:

     http://localhost:8080/admin-ws/services/user/getUser 

    有什么不同?

应该如何看待:遵循良好的REST(包括命名)实践

 @ApplicationPath("/services") public class WebConfig extends Application { } @Path("/users") public class UserResource implements Serializable { @Inject private UserService userService; @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public UserWsPojo getUser(@PathParam("id") String id) { UserWsPojo uwp = userService.getUserById(id); return uwp; } } 

访问:

 http://localhost:8080/admin-ws/services/users/12344 // some user id 

当我尝试使用3.0.11.Final时,我遇到了同样的问题

  org.jboss.resteasy resteasy-jaxrs 3.0.11.Final  

但是当我尝试使用另一个版本时,它可以工作

  org.jboss.resteasy resteasy-jaxrs 3.0.4.Final  

希望这可以帮助。

合并所有响应和下面的代码应该可行。 在tomcat 7.0.56,RESTEasy 3.0.10,Netbeans 8.0.2中测试

WebConfig.java:

 import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/services") public class WebConfig extends Application { // No methods defined inside } 

SayHello.java:

 import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; import javax.ws.rs.Produces; @Path("/greet") public class SayHello { @GET @Path("/{username}") @Produces("text/html") public Response printMessage(@PathParam("username") String username) { return Response.status(200).entity("Hello " + username).build(); } } 

Netbeans生成web.xml:无需更改

      30    

REST服务的URL:

 http://hostname://services/greet/ 

预期回应

 Hello  

Netbeans生成了POM.XML :(如果使用tomcat和版本2.3或更高版本的maven-war-plugin,请确保包含resteasy-servlet-initializer依赖项)

  4.0.0 com.easyrest easyrest 1.0-SNAPSHOT war easyrest  ${project.build.directory}/endorsed UTF-8     org.jboss.resteasy http://repo.maven.apache.org/maven2/     org.jboss.resteasy resteasy-jaxrs 3.0.10.Final   org.jboss.resteasy resteasy-servlet-initializer 3.0.10.Final   javax javaee-web-api 6.0 provided      org.apache.maven.plugins maven-compiler-plugin 2.3.2  1.6 1.6  ${endorsed.dir}     org.apache.maven.plugins maven-war-plugin 2.3  false    org.apache.maven.plugins maven-dependency-plugin 2.1   validate  copy   ${endorsed.dir} true   javax javaee-endorsed-api 6.0 jar          

我遇到了同样的问题(javax.ws.rs.NotFoundException:无法找到完整路径的资源……)。 根据此链接 ,解决问题的步骤如下:

1)设置应用程序类:

 /** * Application class */ package com.abc.admin.services.config; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/services") // the begining of the Webservice URL public class WebConfig extends Application { private Set singletons = new HashSet(); public WebConfig() { singletons.add(new UserResource()); } @Override public Set getSingletons() { return singletons; } } 

2)设置Resource类:

 /** * Resource class */ package com.abc.admin.service; import java.io.Serializable; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.abc.commons.ws.entity.UserWsPojo; @Path("/user") public class UserResource implements Serializable { private static final long serialVersionUID = 6766329501327292893L; @GET // there is a URL concatenation to access the method (.../services/user/getUser) @Path("/getUser") @Produces(MediaType.APPLICATION_JSON) public UserWsPojo getUser(String id) { UserWsPojo uwp = new UserWsPojo(); uwp.setName("Aayush"); uwp.setSurname("Devmurari"); return uwp; } } 

3)设置web.xml:

   restContext  index.html   resteasy.servlet.mapping.prefix /rest   resteasy-servlet  org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher   javax.ws.rs.Application com.abc.admin.services.config.WebConfig    resteasy-servlet /rest/*    

4)在浏览器中测试配置:

HTTP://本地主机:8080 / restContext / REST /服务/用户/的getUser

这适用于我的所有服务。

 This is a runtime exception indicating a resource requested by a client was not found on the server. Add below entry into your web.xml :  resteasy.resources com.org.abc.xyz.MainClassName  

很难说肯定,但我看到的一件事是你传递一个参数但没有映射URL中的任何参数。 这样会更正确:

 @GET @Path("/getUser/{id}") @Produces(MediaType.APPLICATION_JSON) public UserWsPojo getUser(@PathParam("id") String id) { // do things with stuff } 

然后完整的URL将是/ admin-ws / services / user / getUser / 1以获得ID为1的用户。