服务找不到资源(Wildfly 10.0,JAX-RS)

Service could not find resource (Wildfly 10.0, JAX-RS)

我正在学习 REST 服务并遇到问题:RestEasy 找不到我的资源,尽管我已经尝试了各种方法来演示它们。

异常:

Failed to execute: javax.ws.rs.NotFoundException: RESTEASY003210: Could not find resource for full path: http://localhost:8080/RestfullService/services/hello

其中 RestfullService 是我的项目名称,/service - applicationPath,hello - resource。 None 的错误(404 等)显示在此页面上。

我的web.xml (顺便说一句,我在使用 web app server 3.0 时遇到了关于 web.xml 内容的有争议的方法。根据官方手册,它不是​​必需的,但很多人都赞成。什么是最佳实践?)

<?xml version="1.0" encoding="UTF-8"?>
<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" version="3.0">
  <display-name>RestEasy sample Web Application</display-name>
  <listener>
    <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
  </listener>

  <servlet>
    <servlet-name>resteasy-servlet</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.store.model.WebConfig</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/</param-value>
    </context-param> 
</web-app>

我的pom.xml(虽然我手动添加了所有依赖,但问题并没有消除)

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>RestfullService</groupId>
    <artifactId>RestfullService</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <webXml>webapp\WEB-INF\web.xml</webXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- <executions> <execution> <phase>package</phase> <configuration> <webXml>\webapp\WEB-INF\web.xml</webXml> 
                </configuration> </execution> </executions> -->
            <plugin>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <modules>
                        <ejbModule>
                            <!-- property configurations goes here -->
                        </ejbModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>JBoss repository</id>
    <url>https://repository.jboss.org/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.0.4.Final</version>
            <scope>provided</scope>
        </dependency>
         <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson-provider</artifactId>
            <version>3.0.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-servlet-initializer</artifactId>
            <version>3.0.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>3.0.4.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxb-provider</artifactId>
            <version>3.0.4.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>jaxrs-api</artifactId>
            <version>3.0.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-multipart-provider</artifactId>
            <version>3.0.4.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
                <groupId>org.jboss.spec</groupId>
                <artifactId>jboss-javaee-7.0</artifactId>
                <version>1.0.0.Final</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.annotation</groupId>
            <artifactId>jboss-annotations-api_1.2_spec</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>2.0-EDR1</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.servlet</groupId>
            <artifactId>jboss-servlet-api_3.0_spec</artifactId>
            <version>1.0.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20140107</version>
        </dependency>
    </dependencies>
</project>

ServiceInitialisation.java(有和没有这个 class 正文的选项都没有帮助):

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/services")
public class ServiceInitialisation extends Application{
//  private Set<Object> singletons = new HashSet<Object>();
//    private Set<Class<?>> classes = new HashSet<Class<?>>();
//
//  public ServiceInitialisation() {
//      singletons.add(new GoodsWebServiceImpl());
//  }
//
//  @Override
//  public Set<Object> getSingletons() {
//      return singletons;
//  }
//
//    @Override
//    public Set<Class<?>> getClasses() {
//        return classes;
//    }

}

最后 服务:

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import com.store.entity.Item;
@Path("/")
public interface GoodsWebService {

    @GET
    @Path("/hello")
    @Produces("application/json")
    public Response greet();

     // id: \d+ - regex for cheching if it is int  @GET    @Path("{id:
     \d+}")    
    @Produces("application/json")   
    public Response
    getInfoById(@PathParam("id") int id);

    @GET
    @Path("/all")
    @Produces("application/json")
    public List<Item> getAllItems();
}

    package com.store.restService;

import java.util.ArrayList;
import java.util.List;

//import org.json.JSONException;
//import org.json.JSONObject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import org.json.JSONObject;

import com.store.entity.Item;
import com.store.entity.Shop;

@Path("/")
public class GoodsWebServiceImpl implements GoodsWebService
{
    private static List<Item>data;
    private static List<Shop>shops1;
    private static List<Shop>shops2;
    private static List<Shop>shops3;
    private static Shop shop1;
    private static Shop shop2;
    private static Shop shop3;
    static {
        shop1 = new Shop(1,4.55, 1);
        shop2 = new Shop(2,9.99, 2);
        shop3 = new Shop(3,6,0);
        shops1.add(shop1); shops1.add(shop2);
        shops2.add(shop3); shops2.add(shop1);
        shops3.add(shop2); shops3.add(shop3);
        data = new ArrayList<>();
        data.add(new Item(1, "hand", shops1));
        data.add(new Item(2, "pen", shops2));
        data.add(new Item(3, "ball", shops2));
    }
    public static Item getItemById(int id){
        for(Item e: data){
            if(e.getId()==id) return e;
        }
        throw new RuntimeException("Can't find Item with id -" + id);
    }
    public static List<Item> getAll(){
        return data;
    }
    @Override
    public Response greet(){
        String result = "Hello!";
        return Response.status(200).entity(result).build();
    }
    @Override
    public Response getInfoById(int id){
        JSONObject jsonObject = new JSONObject();
        Item item = getItemById(id);
        jsonObject.put("Id ", item.getId()); 
        jsonObject.put("Mpn ", item.getMpn());
        jsonObject.put("Shop ", item.getShops());

        String result = "Output:\n" + jsonObject;
        return Response.status(200).entity(result).build();
    }
    @Override
    public List<Item> getAllItems(){
//      JSONObject jsonObject = new JSONObject();
//      List<Item> items = getAll();
//      jsonObject.put("List", items);
//      JSONArray jArray = jsonObject.getJSONArray("List");
//      for(int i=0; i<jArray.length(); i++){
//          System.out.println(jArray.getJSONObject(i).getString("id"));
//          System.out.println(jArray.getJSONObject(i).getString("mpn"));
//          System.out.println(jArray.getJSONObject(i).getString("shop"));
//      }
        return getAll();
    }
}

我将不胜感激任何意见,因为网络上所有可用的解决方案都已尝试过,但均未成功。 提前致谢

更新: 由于只有少数手册在我的机器上成功部署,我想我在创建项目的过程中选择了错误的设置。 我以这种方式为 REST 创建项目:创建动态 Web 项目 -> 将其转换为 Maven -> 添加依赖项等 -> 尝试部署

截图: The image is here

更新2 此外,我注意到每次启动 WildFly 时都会遇到同样的错误。我试图创建一些具有各种依赖项的项目,但结果是一样的。如何处理?

    22:45:09,109 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."RestService.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."RestService.war".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "RestService.war"
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:163)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer from [Module "deployment.RestService.war:main" from Service Module Loader]
    at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.checkDeclaredApplicationClassAsServlet(JaxrsScanningProcessor.java:292)
    at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.scanWebDeployment(JaxrsScanningProcessor.java:153)
    at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.deploy(JaxrsScanningProcessor.java:104)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:156)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer from [Module "deployment.RestService.war:main" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)
    at org.jboss.as.jaxrs.deployment.JaxrsScanningProcessor.checkDeclaredApplicationClassAsServlet(JaxrsScanningProcessor.java:290)
    ... 8 more

22:45:09,114 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 1) WFLYCTL0013: Operation ("full-replace-deployment") failed - address: ([]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"RestService.war\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"RestService.war\".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment \"RestService.war\"
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer from [Module \"deployment.RestService.war:main\" from Service Module Loader]
    Caused by: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer from [Module \"deployment.RestService.war:main\" from Service Module Loader]"}}

您的 POM 中不需要 web.xmlresteasy-servlet 或任何明确的 RESTEasy 依赖项。

你最好从一个简单的工作示例开始,例如https://github.com/wildfly/quickstart/tree/10.x/jaxrs-client

尽管名称如此,但此示例不仅包括 JAX-RS 客户端,还包括 JAX-RS 服务。