我在JBoss 7.1上部署RESTful Web应用程序(JAX-RS)时遇到问题 这是web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>HEODWS</display-name>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>it.heod.ws.WSApplication</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
实现Web服务的类是:
@Path("/")
public class LoginService {
public LoginService() {
}
@GET
@Path("helloworld")
@Produces(MediaType.TEXT_PLAIN)
public Response helloWorld() {
Utils utils = Utils.getInstance();
utils.logExecutingMethod();
ResponseBuilder responseBuilder = null;
Response response = null;
responseBuilder = Response.ok();
responseBuilder.entity("Hello, world!");
response = utils.completeResponse(responseBuilder);
return (response);
}
}
WSApplication类是:
public class WSApplication extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> empty = new HashSet<Class<?>>();
public WSApplication(){
singletons.add(new LoginService());
}
@Override
public Set<Class<?>> getClasses() {
return empty;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
现在,如果我在我的JBoss 7.1本地副本上部署WAR文件,那么我将转到
http://localhost:8080/HEODWS/helloworld
服务行为正常,我得到了所需的响应,而如果我将其部署在另一台服务器上,运行JBoss 7.1,我会去
http://anotherhost:8080/HEODWS/helloworld
我找不到404。
任何人都可以理解为什么,即两台服务器之间有什么区别?也许我已经配置(过去)我的本地服务器,以至于我现在不记得了?
提前多多感谢, 詹卢卡
答案 0 :(得分:1)
JBoss AS 7.1为您提供Java EE 6支持,因此您不需要使用RESTEasy提供的servlet调度程序(只有在Tomcat或Jetty上部署时才需要它)。
然后,您可以从web.xml中删除内容,并以纯Java形式声明您的JAX-RS Activator:
@ApplicationPath("/")
public class WSApplication extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> empty = new HashSet<Class<?>>();
public WSApplication(){
singletons.add(new LoginService());
}
@Override
public Set<Class<?>> getClasses() {
return empty;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
您甚至可以删除WSApplication
课程中的所有方法和字段(即,只有javax.ws.rs.core.Application
的空子类)并使用LoginService
注释您的@RequestScoped
课程(或@Stateless
)。
HTH。 泽维尔
答案 1 :(得分:0)
我实际上并不知道发生了什么,但通过在新项目中复制并粘贴所有类和web.xml并进行部署,它起作用了。我想这只是Eclipse疯了。谢谢大家的答案。