Over a million developers have joined DZone.

Apache TomEE & NoSQL (Writing Your Own Resources)

· Java Zone

Discover how powerful static code analysis and ergonomic design make development not only productive but also an enjoyable experience, brought to you in partnership with JetBrains


@Resource annotation appeared for the first time in Java EE 5 specification. When you annotate an attribute with @Resource, it will be the container responsible of injecting the requested resource. The typical example is used with DataSource class.

import javax.annotation.Resource;

@Resource(name = "myDataSource")
private DataSource movieDatabase;
That's great and you can use it with JMS as well, but what's happening to NoSQL databases, would not it be perfect to do something similar for them?
With Apache TomEE you can do it by providing your own @Resource provider class. In this post we are going to see how you write your own provider for MongoDB so you can use @Resource for MongoDB too.
The first thing to do is create the provider class, which is a simple 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;
It is a simple POJO with a method which returns a MongoClient class (the base class for Java MongoDB driver), and setters with required parameters.
Next step is creating a file called resources.xml in WEB-INF directory. In this file we configure TomEE so he knows about the provider/class.

	<Resource id="mongo" class-name="com.lordofthejars.tomee.jpa.MongoProvider">
		address localhost
		port 27017
Notice that in this file you set the provider class and how the attributes are set. In fact you set them more or less like a properties file. So when you are are writing address, TomEE under the cover will call provider.setAddress("")
The last thing to do is start using @Resource annotation with MongoDB.
@Resource(name = "mongo")
private MongoProvider mongo;
public void createBookInMongo(Book book) throws Exception {
	MongoClient mongoClient = mongo.mongoClient();

So in this case we are creating a MongoClient provider because TomEE requires a no parameters constructor, but MongoClient has parameters so we need to create a provider class with a method which returns the MongoClient instance to be used.
And what really is awesome about TomEE is that you can even override your @Resource definitions from system properties, so you can do something like:
where mongo is the id of the resources file and address the name of the field.
So you can change each of the value in an easy way depending on the environment you are pushing. And that's an awesome thing.
So now there is no excuses to not start treating NoSQL databases like SQL databases from the point of view of Java EE.

[Update] Romain notice me that with latest version of Apache TomEE you don't need a default constructor, parameters are bound directly properties as constructor params

We keep learning,


Learn more about Kotlin, a new programming language designed to solve problems that software developers face every day brought to you in partnership with JetBrains.


Published at DZone with permission of Alex Soto, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}