Как правильно организовать ресурсы Джерси с помощью наследования и дженериков?

Я разрабатываю приложение для Джерси, где у меня много ресурсов. Хотя основная функциональность этих ресурсов различается, они используют множество общих методов (, таких как список, чтение, обновление и т. д. ). Приложение работает на Google App Engine и использует Guice для внедрения зависимостей.

Мой первый подход состоял в том, чтобы иметь общий AbstactResource, который содержит всю общую логику и, соответственно, расширяется всеми другими ресурсами, которые добавляют свои необходимые пользовательские методы.

public class AbstractResource<T> {

@GET
public ListPage<T> list(@QueryParam("limit") Integer limit,
    @QueryParam("start") Integer start) {
    //... implementation
}

@GET
@Path("/{id}")
public T get(@PathParam("id") Long id) {
    //... implementation
}

И образец ресурса выглядит так:

public class TenantResource extends AbstractResource<Tenant> {
    // custom resource related methods here
}

В этом случае все работает нормально. Проблемы появляются, когда я добавляю еще один уровень абстракции. Скажем, если я хочу хранить историю и журналы изменений только для некоторых моих ресурсов. Я создал еще один абстрактный класс, расширяющий AbstractResource, под названием AudiatableResource, который добавляет необходимую функциональность.

public abstract class AuditableResource<T extends AuditableModel> 
    extends AbstractResource {
        // here I override update and create methods to save changelogs
}

Как вы видите, параметр типа в этом случае изменился (теперь он расширяет AuditableModel ).

Новые конкретные ресурсы будут выглядеть так:

public class PropertyResource extends AuditableResource<Tenant> {
    // custom resource related methods here
}

В этом случае все по-прежнему работает, но на этот раз я получаю много предупреждающих сообщений при запуске -вверх:

WARNING: Return type T of method public T com.pkg.AbstractResource.get(java.lang.Long) is not resolvable to a concrete type
WARNING: Return type T of method public T com.pkg.AbstractResource.getNew() is not resolvable to a concrete type
WARNING: Return type com.pkg.data.ListPage<T> of method public com.pkg.ListPage<T> com.pkg.AbstractResource.list(java.lang.Integer,java.lang.Integer) is not resolvable to a concrete type

Мне действительно интересно, правильный ли этот подход с использованием Джерси и если я могу просто игнорировать это сообщение. Было бы интересно узнать, как организованы ресурсы в случаях, когда их большое количество.

6
задан turan 4 May 2012 в 21:08
поделиться