Уровень веб-службы jax-ws для провайдера данных на основе гибернации - PullRequest
1 голос
/ 29 октября 2010

Поставщик данных (java, hibernate) имеет API для доступа к экземплярам классов, аннотированных JPA.Веб-сервис (jax-ws) предоставляет API-интерфейс сетевым клиентам.Небольшая проблема, которую я думаю решить, заключается в том, что клиент поставщика данных не может быть легко перенастроен на использование поставщика напрямую или через веб-сервис.Причина в том, что для любого персистентного класса есть определение этого класса в клиентском коде jax-w и в коде поставщика данных, они структурно идентичны, но являются разными классами в Java.Очевидное решение поместить сгенерированные классы в то же пространство имен, что и исходные классы, и настроить путь к классу таким образом, чтобы сгенерированные классы всегда игнорировались, не кажется чистым.

Кто-нибудь решилэто или знает лучший способ?

1 Ответ

1 голос
/ 29 октября 2010

Один из способов решения этой проблемы - работать с интерфейсами и использовать отражение для создания прокси-объектов, которые обертывают реальный базовый объект.Что-то вроде:

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);
...