LINUX.ORG.RU

Как создать DI-аннотацию, использующую строковые параметры?

 ,


0

3

Да, код на груви, но суть, я думаю, ясна.

У меня есть такой бин для доступа к монго:

@javax.ejb.Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
class MongoResource {
    GMongo mongo = null
    DB db = null

    @Lock(LockType.READ)
    def getMongo() {
        return mongo
    }

    @Lock(LockType.READ)
    def getDb() {
        return db
    }

    @PostConstruct
    public void init() {
        mongo = new GMongo()
        db = mongo.getDB("dbname")
    }
}

Пока что всё это я использую так:

@Path("foo")
class FooRestService {
    DBCollection collection
    
    @Inject
    def setCollection(MongoResource resource) {
        this.collection = resource?.db?.getCollection("foo")
    }

    @GET
    def list() {
        def result = collection.find()
        // ...
    }
}
Но писать для каждого сервиса однотипные сеттеры такой утомляет.

Я хочу создать аннотацию, чтобы можно было делать так:

@Path("foo")
class FooRestService {
    @Mongo(collection = "foo") // Указываем имя коллекции, имя БД по желанию
    DBCollection collection

    @GET
    def list() {
        def result = collection.find()
        // ...
    }
}

Т.е. в аннотацию передаём имя коллекции (имя БД будет одним для приложения, хотя и его можно будет задать), и в поле collection инъектится нужная коллекция.

Есть ли простой способ сделать такую штуку? Смотрел примеры с @Inject и @Produces, но вроде для этого случая это не подходит.


вопрос ниочем. В спринге есть @Qualifier и @Resource, за примерами можешь туда смотреть.

maloi ★★★★★
()

Вот примеры для CDI:

http://www.byteslounge.com/tutorials/java-ee-cdi-producer-methods-tutorial

http://www.javacodegeeks.com/2013/06/java-ee-cdi-programmatic-dependency-disa...

http://insidecoffe.blogspot.ru/2011/05/configuration-parameter-injection-with...

Определи квалификатор с элементом для имени коллекции, и создавай экземпляры коллекций в @Produces-методе, получая информацию из квалификатора через InjectionPoint. Заодно можно параметризовать и используемую базу. Примерно так:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
@interface MongoCollection {
  String database();
  String collection();
}

class MongoProducer {
  private static GMongo mongo = new GMongo();

  @Produces
  public DBCollection getCollection(InjectionPoint ip) {
    MongoCollection annotation = ip.getAnnotated().getAnnotation(MongoCollection.class);
    return mongo.getDB(annotation.database()).getCollection(annotation.collection());
  }
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.