Impl远程时如何注解Jersey POJO?
How to annotate Jersey POJO when Impl is remote?
我有 2 个 JVM。
JettyJVM
运行 http 请求并有一个 CarFacade 接口,该接口使用 RmiProxyFactoryBean 支持到 CoreJVM
中的 CarFacadeImpl 运行
<bean class="org.springframework.remoting.rmi.RmiProxyFactoryBeanFactory">
<property name="serviceInterface" value="org.foo.CarFacade"/>
<property name="serviceUrl" value="rmi://#{HOST}:1099/CarFacade"/>
</bean>
CoreJVM
在 spring 容器中运行核心业务逻辑并具有 CarFacadeImpl
<bean id="carFacade" class="org.foo.impl.CarFacadeImpl"></bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="carFacade"></property>
<property name="serviceInterface" value="org.foo.CarFacade"></property>
<property name="serviceName" value="CarFacade"></property>
<property name="replaceExistingBinding" value="true"></property>
<property name="registryPort" value="1099"></property>
</bean>
此设置目前适用于 flex/blazds,并且我的服务公开得很好。
有什么方法可以通过 Jersey 公开这个吗?
我尝试使用 Impl 上的注解(首选),但组件扫描没有找到注解(显然是因为接口没有注解)
所以我尝试使用接口上的注释,但球衣说它无法实例化接口。
// CarFacadeImpl.java - when I had the annotations on the class in the CoreJVM
@Path("car")
public class CarFacadeImpl implements CarFacade {
@GET
public String getName() {
return "CarFacade";
}
}
// CarFacade.java - When I had the annotations on the interface in JettyJVM
@Path("car")
public class CarFacade {
@GET
String getName();
}
我真的不想为了通过 rest 公开而编写额外的层。
我已经尝试了这里的示例 http://www.webappsolution.com/wordpress/2012/03/23/one-java-service-pojo-for-amfxmljson-with-spring-blazeds-jersey-jax-rs/,它们在中间没有 RMI 调用的情况下工作。
我找到了答案,至少对于 Jersey 2.16。它确实需要在界面上添加注释,但这比创建一个全新的层要好得多
覆盖默认路径扫描注册并使用类似这样的注册:
// Jersey ResourceConfig
final ResourceConfig rc = new ResourceConfig();
// Get my Spring context
final ApplicationContext context = new ClassPathXmlApplicationContext("clientContext.xml");
// Use Springs class path scanner to find @Path annotated classes
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false) {
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
return beanDefinition.getMetadata().isIndependent();
}
};
scanner.addIncludeFilter(new AnnotationTypeFilter(Path.class));
// For each class found in package (and sub packages)
for (BeanDefinition bd : scanner.findCandidateComponents("example")) {
try {
// Get the class
Class clazz = HttpServer.class.getClassLoader().loadClass(bd.getBeanClassName());
// Get the proxy
Object bean = context.getBean(clazz);
if (bean != null) {
// Register the proxy with the interface
rc.register(bean, clazz);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
我有 2 个 JVM。
JettyJVM 运行 http 请求并有一个 CarFacade 接口,该接口使用 RmiProxyFactoryBean 支持到 CoreJVM
中的 CarFacadeImpl 运行<bean class="org.springframework.remoting.rmi.RmiProxyFactoryBeanFactory">
<property name="serviceInterface" value="org.foo.CarFacade"/>
<property name="serviceUrl" value="rmi://#{HOST}:1099/CarFacade"/>
</bean>
CoreJVM 在 spring 容器中运行核心业务逻辑并具有 CarFacadeImpl
<bean id="carFacade" class="org.foo.impl.CarFacadeImpl"></bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="carFacade"></property>
<property name="serviceInterface" value="org.foo.CarFacade"></property>
<property name="serviceName" value="CarFacade"></property>
<property name="replaceExistingBinding" value="true"></property>
<property name="registryPort" value="1099"></property>
</bean>
此设置目前适用于 flex/blazds,并且我的服务公开得很好。
有什么方法可以通过 Jersey 公开这个吗?
我尝试使用 Impl 上的注解(首选),但组件扫描没有找到注解(显然是因为接口没有注解) 所以我尝试使用接口上的注释,但球衣说它无法实例化接口。
// CarFacadeImpl.java - when I had the annotations on the class in the CoreJVM
@Path("car")
public class CarFacadeImpl implements CarFacade {
@GET
public String getName() {
return "CarFacade";
}
}
// CarFacade.java - When I had the annotations on the interface in JettyJVM
@Path("car")
public class CarFacade {
@GET
String getName();
}
我真的不想为了通过 rest 公开而编写额外的层。
我已经尝试了这里的示例 http://www.webappsolution.com/wordpress/2012/03/23/one-java-service-pojo-for-amfxmljson-with-spring-blazeds-jersey-jax-rs/,它们在中间没有 RMI 调用的情况下工作。
我找到了答案,至少对于 Jersey 2.16。它确实需要在界面上添加注释,但这比创建一个全新的层要好得多
覆盖默认路径扫描注册并使用类似这样的注册:
// Jersey ResourceConfig
final ResourceConfig rc = new ResourceConfig();
// Get my Spring context
final ApplicationContext context = new ClassPathXmlApplicationContext("clientContext.xml");
// Use Springs class path scanner to find @Path annotated classes
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false) {
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
return beanDefinition.getMetadata().isIndependent();
}
};
scanner.addIncludeFilter(new AnnotationTypeFilter(Path.class));
// For each class found in package (and sub packages)
for (BeanDefinition bd : scanner.findCandidateComponents("example")) {
try {
// Get the class
Class clazz = HttpServer.class.getClassLoader().loadClass(bd.getBeanClassName());
// Get the proxy
Object bean = context.getBean(clazz);
if (bean != null) {
// Register the proxy with the interface
rc.register(bean, clazz);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}