【发布时间】:2014-02-05 05:00:49
【问题描述】:
我正在使用 JBoss 7.2,我的应用程序中有一个空的 web.xml:
<?xml version="1.0"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
我使用了依赖:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.6.Final</version>
<scope>provided</scope>
</dependency>
简单的应用:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
}
@Path("/v1")
public class RestfulService {
@POST
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/test")
public String testAPI() {
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
jsonObject.put("status", "Success");
return jsonObject.toString();
}
}
但我在尝试localhost:8080/testapplication/rest/v1/test 时得到HTTP 404。我有什么遗漏吗?
更新:
我把web.xml改成了:
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.technology.apiinterface.restful.service.JaxRsActivator</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
</web-app>
并更改了 JaxRsActivator 类:
public class JaxRsActivator extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
singletons.add(new RestfulService());
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
现在尝试localhost:8080/testapplication/rest/v1/test 时,我得到以下异常:
Allocate exception for servlet Resteasy: java.lang.ClassCastException: com.technology.apiinterface.restful.service.JaxRsActivator cannot be cast to javax.ws.rs.core.Application
at org.jboss.resteasy.spi.ResteasyDeployment.createApplication(ResteasyDeployment.java:295) [resteasy-jaxrs-3.0.6.Final.jar:]
at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:236) [resteasy-jaxrs-3.0.6.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:112) [resteasy-jaxrs-3.0.6.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36) [resteasy-jaxrs-3.0.6.Final.jar:]
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1194) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:950) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:151) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.2.0.Final-redhat-4.jar:7.2.0.Final-redhat-4]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
【问题讨论】:
-
第一个假设:这并不神秘。看起来您扩展了错误的 Application 类。
-
import javax.ws.rs.core.Application;不会是导入错误吧? -
嗯实际上没有错。检查我自己的设置,我没有 servlet,我只是用 @ApplicationPath("/REST") 注释应用程序类,这是 JBoss 实际初始化 JAX-RS 子系统的触发器。
-
我什至尝试使用空的
web.xml和@ApplicationPath("/rest"),但是在部署时我得到No Servlet mappings found for JAX-RS application: com.technology.apiinterface.restful.service.JaxRsActivator either annotate it with @ApplicationPath or add a servlet-mapping in web.xml -
是的,所以设置有问题。唉,根据您在这里提供的内容,我不能说什么。注释方式是正确的,“在我的机器上工作”并且我也运行我自己的 JBoss 7.2 版本,尽管我将 RestEasy 升级到最新版本以摆脱过时的 Jackson 库的问题。您确定您的应用程序中没有部署 RestEasy / JAX-RS jar 吗?
标签: java jax-rs jboss7.x resteasy