Служба Restful, развернутая на Jboss 7.1, всегда возвращает 404

#jboss #jax-rs #resteasy

#jboss #jax-rs #resteasy

Вопрос:

У меня возникла проблема с развертыванием веб-приложения RESTful (JAX-RS) на JBoss 7.1. 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>
  

В то время как класс, реализующий веб-службу,:

 @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;
    }
}
  

Теперь, если я разверну файл WAR в своей локальной копии JBoss 7.1 и перейду к

 http://localhost:8080/HEODWS/helloworld
  

служба работает правильно, и я получаю желаемый ответ, в то время как если я разверну ее на другом сервере, запустив JBoss 7.1, и я перейду к

 http://anotherhost:8080/HEODWS/helloworld
  

Я получаю 404, который не найден.

Кто-нибудь может понять, почему, т.Е. В чем разница между двумя серверами? Может быть, я настроил (в прошлом) свой локальный сервер таким образом, что сейчас не могу вспомнить?

Заранее большое спасибо, Джанлука

Комментарии:

1. Вы должны добавить косую черту после helloworld.

Ответ №1:

JBoss AS 7.1 предоставляет поддержку Java EE 6, поэтому вам не нужно использовать диспетчер сервлетов, предоставляемый RESTEasy (это необходимо только при развертывании на Tomcat или Jetty).

Затем вы можете удалить содержимое из web.xml и объявите свой активатор JAX-RS в чистой Java-форме следующим образом:

 @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. Xavier

Комментарии:

1. Я этого не знал, @xavier-coulon. Большое спасибо

Ответ №2:

На самом деле я не знал, что произошло, но путем копирования и вставки всех классов и web.xml в новом проекте и при развертывании это сработало. Я полагаю, что это просто Eclipse сошел с ума. Спасибо всем за ответы.