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")
==追加/services
到Base(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
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的用户。