gpt4 book ai didi

java - jax-ws Web 服务层到基于 hibernate 的数据提供程序

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:12 25 4
gpt4 key购买 nike

数据提供程序(java、hibernate)具有用于访问 JPA 注释类的实例的 API。 Web 服务 (jax-ws) 向网络客户端公开 API。我想解决的一个问题是数据提供者的客户端无法轻松地重新配置为直接使用提供者或通过网络服务使用提供者。原因是,对于任何持久类,jax-ws 客户端代码和数据提供者代码中都有该类的定义,它们在结构上是相同的,但在 Java 中是不同的类。将生成的类放入与原始类相同的命名空间并以始终忽略生成的类的方式设置类路径的明显解决方案似乎不是一个干净的解决方案。

有人解决了这个问题或者知道更好的方法吗?

最佳答案

我在类似问题中解决此问题的一种方法是使用接口(interface)并使用反射来构建包装真实底层对象的代理对象。像这样的东西:

interface IEntity
{
void setFoo(String foo);

String getFoo();
}

class WSEntity
{/* code generated by jax-ws */
}

class DataEntity
{ /* code generated by java, hibernate, .. */
}

class WSEntityInvocationHandler implements InvocationHandler
{
private final WSEntity entity;

public WSEntityInvocationHandler(WSEntity entity)
{
this.entity = entity;
}

public Object invoke(Object proxy,
Method method, Object[] args) throws Throwable
{
// this is a simplified version
Method m = entity.getClass().getMethod(method.getName(), params);
return m.invoke(entity, args);
}
}

static void example()
{
InvocationHandler handler = new WSEntityInvocationHandler(entity);
IEntity ie = (IEntity) Proxy
.newProxyInstance(IEntity.class.getClassLoader(),
new Class[]{IEntity.class},
handler);
}

基本上,您的应用程序需要做的就是决定使用哪个“调用处理程序”,例如

InvocationHandler handler = new WSEntityInvocationHandler(entity);

InvocationHandler handler = new DataEntityInvocationHandler(entity);

关于java - jax-ws Web 服务层到基于 hibernate 的数据提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com