Category Archives: web

Logger CDI Injection

In this post I will show you how to inject an instance of Logger class using CDI (Context Dependency Injection) and SLF4J (Simple Logging Facade for Java).

To keep it simple, we only have a xhtml page (index), a managed bean (Controller.java) and the producer (LoggerProducer.java). The project configuration is as follows:

project
project

 

As we are using JSF with facelets, the index page looks like:

In this file we simply display the name that is setted in the controller (line 10).

 

In the controller we inject (@Inject) an instance of the Logger class and print to the console the name before and after the name is setted (lines 23 and 25). CDI knows which Logger to inject because we have a class that works as a factory of Loggers (LoggerProducer) with some special annotations.

 

In the LoggerProducer class we have an annotation (@Produces) in a method that returns a Logger instance. This is enough to CDI inject a Logger when needed. Notice that in line 13 we pass as a parameter the injection point (ip) in order to get the class where the logger is being injected (in this specific case ‘Controller.class’). This is only necessary beacuse the getLogger method needs it.

Finally, here are the results (the log and the web page):

log

log

As you can see here, we have two lines displaying the information that we expected: first the name is null and after the set of the variable name, name = John Doe.

the result page
the result page

 

That’s it. It’s just that simple!

Conclusion

First we create a factory of loggers, then we inject them whenever we need them:
@Produces to indicate CDI what we are producing and
@Inject to inject the instance ready to use.

Notice that this methodology works with other types rather than Logger. You may inject whatever you want by simply following the above technic.

Feel free to comment.

Source code

JSF 2.2 Flash Scope Example

JSF 2.2 Flash Scope Example

In this article I will try to explain you how to use the flash scope in Java EE.

Introduced in JSF 2.0, the flash scope provides a short-lived conversation (flash session). It is a way to pass temporary objects (not only strings) that are propagated across a single view transition and cleaned up before moving on to another view. The flash scope can only be used programmatically as there is no annotation.

In some cases we need to redirect from one view to another view in JSF.  But when we do a redirect we lost everything that is stored in the url with a GET request. One solution is to use an EL expression of the abstract class Flash #{flash.foo}. So, this is a pretty simple solution to redirect without lost anything:

Source files:

index.xhtml
index.xhtml
index.xhtml

The special thing here is the use of #{flash.foo}, where foo is the name of the variable in the flash scope.

 

ExampleController.java
ExampleController.java
ExampleController.java

The goal of this controller is just to do a redirect from the index.xhtml to the target.xhtml.

 

target.xhtml
target.xhtml
target.xhtml

Here we fetch the value of the foo variable by doing again #{flash.foo} to display the data.

The results:
fpage_hello
This is the first page with the message Hello World.

 

2ndpage

And finally this is the second page (target.xhtml) wich displays the message from the previous page.

Final Considerations

We’ve learned how to pass values with the help of flash from one view to another with redirects.

Notice that if you refresh the second page after it shows up, all the data has gone. That’s because the flash scope was destroyed immediately when the rendering of the second page occurs. This is the goal of the flash scope. It just holds some values (in a flash session) between one HTTP request and the subsequent HTTP response.

This type of scope must be done programmatically. There is no annotation, like there is, for example, to the request scope (@RequestScoped).

Please feel free to comment.

Download Source Files

See it running here…