Соединение MongoDB, управляемое контейнером, в Liberty + Spring Data

Мы разработали приложение в Spring Boot + spring data (бэкенд) + MongoDB и использовали IBM Websphere Liberty в качестве сервера приложений. Мы использовали "Подключение к БД, управляемое приложением" в файле yml и наслаждались преимуществами Spring Boot autoconfiguration.

Из-за изменений политики нам нужно будет управлять нашим соединением с БД в Liberty Server (используя функцию mongo), в Server.xml. Я потратил целый день, чтобы найти хороший пример для этого, но не нашел ни одного примера в Spring с "Контейнерное управляемое соединение MongoDB" в IBM Websphere Liberty Server.

Может ли кто-нибудь поддержать здесь?


person omega    schedule 14.08.2018    source источник


Ответы (2)


Ознакомьтесь с другим решением stackoverflow. Ниже приведено расширение того, как вы могли бы использовать это в своем приложении Spring Boot.

Вы должны иметь возможность вводить свой источник данных таким же образом. Вы даже можете внедрить его в свою конфигурацию и обернуть в Spring DelegatingDataSource.

@Configuration
public class DataSourceConfiguration {

    // This is the last code section from that link above
    @Resource(lookup = "jdbc/oracle")
    DataSource ds;

    @Bean
    public DataSource mySpringManagedDS() {
        return new DelegatingDataSource(ds);
    }

}

Затем вы сможете вводить mySpringManagedDS DataSource в свои Component, Service и т. д.

person Dovmo    schedule 21.08.2018

В прошлом у Liberty была специальная функция mongodb-2.0 для server.xml, однако эта функция давала довольно минимальные преимущества, поскольку вам все равно нужно было приносить свои собственные библиотеки MongoDB. Кроме того, со временем MongoDB внесла значительные критические изменения в свой API, в том числе в то, как MongoDB настраивается.

Поскольку API MongoDB так сильно меняется между выпусками, мы решили, что лучше не предоставлять какие-либо новые функции MongoDB в Liberty, а вместо этого предложить пользователям просто использовать производителя CDI следующим образом:

Производитель CDI (также поддерживает любую конфигурацию):

@ApplicationScoped
public class MongoProducer {

    @Produces
    public MongoClient createMongo() {
        return new MongoClient(new ServerAddress(), new MongoClientOptions.Builder().build());
    }

    @Produces
    public MongoDatabase createDB(MongoClient client) {
        return client.getDatabase("testdb");
    }

    public void close(@Disposes MongoClient toClose) {
        toClose.close();
    }
}

Пример использования:

@Inject
MongoDatabase db;

@POST
@Path("/add")
@Consumes(MediaType.APPLICATION_JSON)
public void add(CrewMember crewMember) {
    MongoCollection<Document> crew = db.getCollection("Crew");
    Document newCrewMember = new Document();
    newCrewMember.put("Name",crewMember.getName());
    newCrewMember.put("Rank",crewMember.getRank());
    newCrewMember.put("CrewID",crewMember.getCrewID());
    crew.insertOne(newCrewMember);
}

Это только основы, но следующий пост в блоге содержит гораздо больше деталей вместе с примерами кода: https://openliberty.io/blog/2019/02/19/mongodb-with-open-liberty.html

person Andy Guibert    schedule 25.02.2019