ContainerException: Экземпляр ResourceConfig не содержит никаких корневых классов ресурсов при развертывании моего приложения на сервере Wildfly

#java #rest #jboss #jersey #wildfly

#java #rest #jboss #джерси #wildfly

Вопрос:

я пытаюсь создать простую службу rest и развернуть приложение на сервере wildfly, и когда я пытаюсь развернуть свое приложение на сервере, у меня возникает следующее исключение:

 Cannot upload deployment: {"WFLYCTL0080: Failed services" => 
{"jboss.undertow.deployment.default-server.default-host./resttestapp" => 
"org.jboss.msc.service.StartException in service 
jboss.undertow.deployment.default-server.default-host./resttestapp: 
com.sun.jersey.api.container.ContainerException: The ResourceConfig 
instance does not contain any root resource classes. Caused by: 
com.sun.jersey.api.container.ContainerException: The ResourceConfig 
instance does not contain any root resource classes."}}
  

Я много чего перепробовал из stackoverflow, но у меня ничего не работает.

Я использую Wildfly 9.0.2 (автономный, развертывается через консоль администратора), Intellij idea.

Это часть моего pom.xml:

 <groupId>cz.prg.rob</groupId>
  <artifactId>resttestapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>resttestapp Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <jersey.version>1.19.4</jersey.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>${jersey.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-server -->
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-server</artifactId>
      <version>${jersey.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-bundle</artifactId>
      <version>${jersey.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.json/json -->
    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20180813</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.6</version>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>
  </dependencies>
  

Это мой web.xml:

 <web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>cz.prg.rob</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>JerseyServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>
  

Это мой класс обслуживания:

 package cz.prg.rob;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import java.util.Date;

@Path("/name")
public class UserService {

    @GET
    @Produces("text/plain")
    public String getName() {
        return "Qwerty";
    }

    @GET
    @Path("/user")
    @Produces("application/json")
    public User getUser(@QueryParam("name") String name, @QueryParam("surname") String surname, @QueryParam("birthDate") Date birthDate) {
        return new User(name, surname, birthDate);
    }

}
  

и это часть моего класса User (модель):

 @NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    private String name;
    private String surname;
    private Date birthDate;
}
  

Это структура моего проекта:

структура проекта

Я не могу понять, что я делаю не так. Пожалуйста, помогите мне.

Ответ №1:

Решение, которое помогло мне:

Я добавил это как параметр инициализации JerseyServlet

 <init-param>
  <param-name>javax.ws.rs.Application</param-name>
  <param-value>cz.prg.rob.UserServiceApplication</param-value>
</init-param>
  

И это класс, в котором я определил свой класс ресурсов

 public class UserServiceApplication extends Application {
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(UserService.class);
        return s;
    }
}
  

Похоже, я должен явно указать jersey, какие классы являются классами ресурсов. Если вы хотите добавить новые классы ресурсов, просто добавьте их в HashSet в метод getClasses().