2017-11-09 25 views
0

私はRestEasyを埋め込みTomcatで使用して、いくつかのRest APIを展開する実行可能なjarファイルをエクスポートします(テストのためにSpringBootを使用したくありません)。 私はHttpServletDispatcher 埋め込みTomcatのRestEasyはコントローラをスキャンしません

public class Main { 

public static void main(String[] args) throws Exception { 
    try { 
     new Main().run(); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
} 

    public void run() throws Exception { 
     Tomcat tomcat = new Tomcat(); 
     tomcat.setPort(8080); 

     Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath()); 
     String contextPath = "/"; 
     String appBase = "."; 
     tomcat.getHost().setAppBase(appBase); 
     tomcat.addWebapp(contextPath, appBase); 

     Tomcat.addServlet(ctx, "rest-easy-servlet", new HttpServletDispatcher()); 
     ctx.addServletMapping("/*", "rest-easy-servlet"); 
     tomcat.start(); 
     tomcat.getServer().await(); 
    } 
} 

サーバーを登録するには、メインエントリポイントでいくつかのコードを記述してきた成功したがいずれかののREST APIなしで起動します。 localhost:8080/users/helloのパスにアクセスすると、ログにエラーが発生しました。 ProtocolHandler [ "HTTP-NIO-8080"] 2017年11月9日2時21分30秒PMを開始 :

2017年11月9日午前2時21分22秒PMはINFOを開始org.apache.coyote.AbstractProtocol org.jboss.resteasy.core.ExceptionHandler SEVERE: http://localhost:8080/users/hello org.jboss.resteasy.core.registry.ClassNode.match で(ClassNode:フルパスのためのリソースが見つかりませんでした: javax.ws.rs.NotFoundExceptionの実行に失敗しました.java:73) at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) at org.jboss.resteasy.core.ResourceMethodR org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.javaでegistry.getResourceInvoker org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:234)で(ResourceMethodRegistry.java:444) 。 171) でorg.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) でorg.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java: (HttpServlet.java:790)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) でorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) org.apache.catalina.coreで org.apache.catalina.authenticator.AuthenticatorBase.invokeで.StandardWrapperValve.invoke org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)で(StandardWrapperValve.java:217) (AuthenticatorBase.java :502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve。起動 org.apache.catalina.connector.CoyoteAdapter.serviceでorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) で(ErrorReportValve.java:79) (CoyoteAdapter.java:518) でorg.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:673) で org.apache.tomcatでで org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1456) で.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1500) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。Javaの:1142) org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.runで java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) (TaskThread.java:61)で

java.lang.Thread.run(Thread.java:745)で私はRESTEasyには、そのコンポーネントをスキャンする任意の信号を持っていないと思います。 RestEasyのコンポーネントをスキャンする方法や、登録する方法を助けてください。

答えて

1

埋め込みTomcatを使用している場合、リソースとプロバイダは自動的にスキャンされません。 Applicationサブクラスまたはresteasy.resourcesコンテキストパラメータのいずれかをカンマ区切り値を使用して手動で登録する必要があります。

まず第一に、あなたのプロジェクトでは、以下の依存関係を持っていることを確認:

<properties> 
    <tomcat.version>8.5.23</tomcat.version> 
    <resteasy.version>3.1.4.Final</resteasy.version> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-core</artifactId> 
     <version>${tomcat.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-jaxrs</artifactId> 
     <version>${resteasy.version}</version> 
    </dependency> 
</dependencies> 

JAX-RSのリソースクラスを作成します。

@Path("hello") 
public class HelloWorldResource { 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response helloWorld() { 
     return Response.ok("Hello World!").build(); 
    } 
} 

Applicationサブクラスを作成し、作成したリソースクラスを登録上記:

public class MyApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     return Collections.singleton(HelloWorldResource.class); 
    } 
} 

Tを起動するクラスを作成するアプリケーションをomcatと展開:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <configuration> 
       <finalName>tomcat-embedded-example-${project.version}</finalName> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.example.Launcher</mainClass> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

従って、アプリケーションをコンパイルして実行するには:

public class Launcher { 

    private static final String RESTEASY_SERVLET_NAME = "resteasy-servlet"; 

    public static void main(String[] args) throws Exception { 
     new Launcher().start(); 
    } 

    void start() throws Exception { 

     String port = System.getenv("PORT"); 
     if (port == null || port.isEmpty()) { 
      port = "8080"; 
     } 

     String contextPath = "/api"; 
     String appBase = "."; 

     Tomcat tomcat = new Tomcat(); 
     tomcat.setPort(Integer.valueOf(port)); 
     tomcat.getHost().setAppBase(appBase); 

     Context context = tomcat.addContext(contextPath, appBase); 
     context.addApplicationListener(ResteasyBootstrap.class.getName()); 
     Tomcat.addServlet(context, RESTEASY_SERVLET_NAME, new HttpServletDispatcher()); 
     context.addParameter("javax.ws.rs.Application", MyApplication.class.getName()); 
     context.addServletMappingDecoded("/*", RESTEASY_SERVLET_NAME); 

     tomcat.start(); 
     tomcat.getServer().await(); 
    } 
} 

は最後にmainClass属性は、上記のクラスを作成して参照する実行可能なJARを作成するために、Mavenのシェードプラグインを追加しますこれらの手順:

  • コマンドラインウィンドウまたはターミナルを開きます。
  • pom.xmlが存在するプロジェクトのルートディレクトリに移動します。
  • プロジェクトをコンパイル:mvn clean compile
  • アプリケーションをパッケージ化:mvn package
  • 対象のディレクトリを確認します。次の名前または似た名前のファイルが表示されます:tomcat-embedded-sample-1.0-SNAPSHOT.jar
  • 対象のディレクトリに移動します。
  • JAR:java -jar tomcat-embedded-example-1.0-SNAPSHOT.jarを実行します。
  • このアプリケーションはhttp://localhost:8080/api/helloにあります。

もっと見る:

+0

ええ、あなたの助けが私に多くの時間を節約できます。私の残りのAPIは今働きます。 – duykaka

0

あなたの提案したように、レストコントローラが自動的に検出/スキャンされないことがあります。あなたは "users /"リソースを公開するmanually register your classを試すことができます。

関連する問題