2

クライアント Web アプリケーション (JSF MB からの単純なクライアント要求) を使用して、安らかな Web サービスを呼び出そうとしています。Web サービスのインターフェイスを作成し、その中でメソッドを呼び出す必要があります。しかし、インターフェイスで @Path を使用すると、エラーが発生します - Jboss の展開中にパブリック コンストラクターが見つかりません。しかし、私が与える場合は、実装クラスで @Path を与えます。サービスを正常に呼び出しており、正常に動作しています。Rest クライアントと Restful Web サービスの impl クラスの間に Java インターフェイスが必要です。誰でも助けることができますか?Rest インターフェイスなどを使用できますか?

クライアント側:

ClientRequest request = new ClientRequest("localhost:8080/RESTfulExample/json/...../"); 
ClientResponse<String> response = request.get(String.class);

レストインターフェース:

package com.nee.interfaces; 
import javax.ws.rs.Path; 
import javax.ws.rs.GET; 

@Path("/OrderManagementService") 
public interface OrderManagementServiceInterface { 
    @GET
    @Path("/GetListOfOrders") 
    void getListOfOrders(); 
}

実装:

package com.nee.implementations;
import com.nee.interfaces.OrderManagementServiceInterface;


public class OrderManagementServiceImpl implements OrderManagementServiceInterface {
    public void getListOfOrders() {
        System.out.println("am here");
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
    <param-name>resteasy.resources</param-name>
    <param-value>
        com.nee.interfaces.OrderManagementServiceInterface
    </param-value>
</context-param>

<!-- this has to match with resteasy-servlet url-pattern -->

<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
</context-param>

<!-- to return data according to extension -->

<context-param>
    <param-name>resteasy.media.type.mappings</param-name>
    <param-value>json : application/json, xml : application/xml</param-value>
</context-param>

<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>
</servlet>

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

ログ:

[org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/web]]
(MSC service thread 1-2) Exception sending context initialized event to listener instance of class
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap: java.lang.RuntimeException: Unable to find a public constructor for class com.seagate.interfaces.OrderManagementServiceInterface
at org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory.registered(POJOResourceFactory.java:35) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:120) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:106) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:83) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.core.ResourceMethodRegistry.addPerRequestResource(ResourceMethodRegistry.java:72) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:383) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:225) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap.contextInitialized(ResteasyBootstrap.java:28) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1]
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.16.Final-redhat-1.jar:]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.16.Final-redhat-1.jar:]
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)[rt.jar:1.7.0_09]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_09]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_09]
4

2 に答える 2

1

上記の問題には簡単な答えがあります。web.xml では、インターフェイスの代わりに、インターフェイスの代わりに IMPL クラスを構成し、インターフェイスで @Path を引き続き設定する必要がありました

<context-param>
    <param-name>resteasy.resources</param-name>
    <param-value>
        com.seagate.implementations.OrderManagementServiceImpl
    </param-value>
</context-param>

そしてそれはうまくいきました:) ...

于 2013-02-26T10:02:01.443 に答える
1

あなたの間違いは、 RestEasy にインターフェースを与え、フレームワークがリフレクションを介してそのインスタンスを作成しようとしているということだと思います。そのようなものは決してうまくいきません。インターフェイスの代わりに、パラメータの値として実装クラスのみを指定する必要がありますresteasy.resources。より動的にしたい場合は、OSGi と REST の組み合わせを試してください。このブログの例は自分で試したわけではありませんが、ご覧ください。

アップデート

サード パーティのクラスからもサービスを使用したいので、REST Web サービスで別のインターフェイスをラップしてみませんか。そのラップされたインターフェイスをサード パーティのクラスで使用できます。Web サービスは、リクエストをこのインターフェースの特定の実装に委任するためにのみ使用されます。Spring、Google Juice などの依存性注入フレームワークを介して実装を注入できます。これが私が意味することです:

実装の抽象化としてのインターフェイス:

interface IExecutionService {
   void executeStuff();
}

次に、REST サービス:

@Path("/OrderManagementService")
class ExectionServiceDelegator {

   private IExecutionService wrappedServiceInterface;

   /**
    * play around with some DI frameworks for injecting your implementation
    */
   public void setIExecutionService(IExecutionService service) {
      wrappedServiceInterface = service;    
   }

   @GET
   @Path("/GetListOfOrders") 
   public void doingSomething() {
      service.executeStuff();
   }
}

IExecutionServiceこのインターフェースは、サードパーティのインターフェースでも特定の DI フレームワークと組み合わせて使用​​できます。上記のコードで何をしようとしているのかが明確になることを願っています?!

于 2013-02-21T05:24:23.563 に答える