2013-02-21 49 views
2

我想調用restful webservice使用客戶端web應用程序(簡單的客戶端請求從JSF MB)。我需要爲webservice創建一個接口,然後調用其中的方法。但是,如果我在接口使用@Path,它會給出一個錯誤 - 在Jboss部署期間找不到公共構造函數。但是如果我給實施課的@Path。它正在調用服務並且工作正常。我需要在Rest客戶端和Restful webservice impl類之間有一個Java接口。誰能幫忙?我們可以有Rest接口嗎?寧靜的webservice公共構造函數未找到

客戶端:

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

RestInterface:

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

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

IMPL:

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] 
+0

發佈您的代碼。如果您使用的是接口,則應該在其上定義所有JAX-RS註釋。 – Perception 2013-02-21 01:05:13

+0

請用格式良好的代碼更新您的文章。 – jdevelop 2013-02-21 01:19:02

+0

您的界面代碼不可編譯。我們也需要你的實現代碼。 – Perception 2013-02-21 01:29:45

回答

1

對上述問題有一個簡單的答案。在web.xml中,而不是接口,我不得不配置IMPL類,而不是接口,並繼續在接口

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

設置@Path和它的工作:)...

+0

這就是我在我的答案中對你說的!第一部分 – 2013-03-06 14:40:49

1

我猜你的錯誤是你給的接口到RestEasy的和框架試圖通過反射來創建它的一個實例。像這樣的東西永遠不會工作。您應該只將實現類指定爲參數resteasy.resources的值,而不是接口。如果你想更動態地嘗試OSGi和REST的組合。我自己並沒有在this的博客中嘗試過這個例子,但你可以看看這個例子。

UPDATE

當你想使用第三方類服務,以及,爲什麼不換另一個接口與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你的第三方接口也是如此。希望很清楚我想要用上面的代碼做什麼?

+0

感謝christian ...所以我們無法使用界面來獲得沒有OSGI的resteasy ??? ..這真的很傷心。通常對於基於SOAP的Web服務,我們曾經有一個接口來調用服務。 – user2093576 2013-02-21 06:10:06

+0

即使在OSGi中,您通常不會使用直接接口來抽象您的REST服務。我認爲這並沒有太大意義。爲什麼?因爲在從客戶端調用資源時實際上不適用於特定的實現。你只需調用一個URL而不需要任何類。只有您的應用程序服務器負責將這些URL映射到資源(在您的示例中是您在類中指定的REST資源路徑)。這意味着URL是某種時尚的「界面」。您只需爲類定義相同的路徑即可輕鬆更改實現... – 2013-02-21 07:20:51

+0

...只需更改'resteasy.resources'參數即可將URL路徑映射到您的新類。希望現在更清楚一點,您不必深深依賴Java接口:)正如您所看到的,所提供的博客中的示例並不使用接口。 ;) – 2013-02-21 07:22:13

相關問題