我正在尝试使用客户端 Web 应用程序调用 Restful Web 服务(来自 JSF MB 的简单客户端请求)。我需要为 Web 服务创建一个接口(interface),然后调用其中的方法。但是如果我在接口(interface)上使用@Path,它会给出一个错误 - 在 Jboss 部署期间找不到公共(public)构造函数。但是如果我在实现类中给出@Path。它调用服务正常并且工作正常。我需要在 Rest 客户端和 Restful Webservice impl 类之间有一个 Java 接口(interface)。有人可以帮忙吗?我们可以有 Rest 接口(interface)什么的吗?
客户端:
ClientRequest request = new ClientRequest("localhost:8080/RESTfulExample/json/...../");
ClientResponse<String> response = request.get(String.class);
休息接口(interface):
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]
最佳答案
我猜你的错误是你给 RestEasy 提供了一个接口(interface),并且框架试图通过反射创建它的实例。这样的事情永远不会成功。您应该只指定实现类作为参数 resteasy.resources
的值,而不是接口(interface)。如果您想要更加动态,请尝试 OSGi 和 REST 的组合。我没有尝试this中的例子我自己的博客,但你可以看看。
更新
由于您也想使用第三方类的服务,为什么不使用 REST Web 服务包装另一个接口(interface),并且该包装的接口(interface)可以在您的第三方类中使用。然后,Web 服务仅用于将请求委托(delegate)给该接口(interface)的特定实现。您可以通过依赖注入(inject)框架(如 Spring、Google Juice 或其他框架)注入(inject)实现。这就是我的意思:
作为实现的抽象的接口(interface):
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();
}
}
您也可以将接口(interface) IExecutionService
与第三方接口(interface)中的特定 DI 框架结合使用。希望大家清楚我想用上面的代码做什么?!
关于java - 未找到 Restful Webservice 公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14992866/