Статьи

Apache TomEE & NoSQL (написание собственных ресурсов)

 

Аннотация @Resource впервые появилась в  спецификации Java EE 5 . Когда вы аннотируете атрибут с помощью @Resource , он будет контейнером, ответственным за внедрение запрошенного ресурса. Типичный пример используется с классом DataSource .

import javax.annotation.Resource;

@Resource(name = "myDataSource")
private DataSource movieDatabase;

Это здорово, и вы можете использовать его и с
JMS , но что происходит с
базами данных
NoSQL , разве не было бы идеально сделать что-то подобное для них?

С
Apache TomEE вы можете сделать это, предоставив свой собственный 
класс провайдера @Resource . В этом посте мы увидим, как вы пишете свой собственный провайдер для
MongoDB, чтобы вы также могли использовать 
@Resource для
MongoDB .

Первое, что нужно сделать, это создать класс провайдера, который является простым
POJO :
import java.net.UnknownHostException;

import com.mongodb.MongoClient;

public class MongoProvider {

	private String address;
	private int port;
	
	public MongoClient mongoClient() throws UnknownHostException {
		return new MongoClient(address, port);
	}
	
	public void setAddress(String address) {
		this.address = address;
	}
	
	public void setPort(int port) {
		this.port = port;
	}
	
}

Это простой
POJO с методом, который возвращает
класс
MongoClient (базовый класс для драйвера Java
MongoDB ) и установщики с необходимыми параметрами.

Следующим шагом является создание файла с именем
resources.xml в
 каталоге
WEB-INF . В этом файле мы настраиваем
TomEE, чтобы он знал о провайдере / классе.
<resources>

	<Resource id="mongo" class-name="com.lordofthejars.tomee.jpa.MongoProvider">
		address localhost
		port 27017
	</Resource>
	
</resources>

Обратите внимание, что в этом файле вы устанавливаете класс провайдера и как задаются атрибуты.
Фактически вы устанавливаете их более или менее как файл свойств. Поэтому, когда вы пишете
адрес 127.0.0.1 ,
TomEE под прикрытием вызовет
provider.setAddress («127.0.0.1»)

Последнее, что нужно сделать, это начать использовать 
аннотацию
@Resource с
MongoDB .
@Resource(name = "mongo")
private MongoProvider mongo;
	
public void createBookInMongo(Book book) throws Exception {
		
	MongoClient mongoClient = mongo.mongoClient();

}

Таким образом, в этом случае мы создаем
поставщика
MongoClient , потому что
TomEE не  требует конструктора параметров, но у
MongoClient есть параметры, поэтому нам нужно создать класс поставщика с методом, который возвращает
используемый экземпляр MongoClient .

И что действительно удивительно в
TomEE, так это то, что вы можете даже переопределить 
определения
@Resource из системных свойств, так что вы можете сделать что-то вроде:
-Dmongo.address = локальный

где mongo — это
идентификатор файла ресурсов и адрес имени
поля .

Таким образом, вы можете легко изменить каждое значение в зависимости от среды, в которой вы работаете.
И это потрясающая вещь.

Так что теперь нет никаких оправданий, чтобы не начинать рассматривать
базы данных
NoSQL, такие как
базы данных SQL, с точки зрения
Java EE .

[Обновление] Ромен, обратите внимание, что в последней версии Apache TomEE вам не нужен конструктор по умолчанию, параметры напрямую связаны со свойствами как параметры конструктора

Мы продолжаем учиться,

Алекс.