Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the equivalent of @Value in CDI world?

What is the way one inject property value from property placeholder into CDI bean?

In Spring one write:

@org.springframework.beans.factory.annotation.Value("${webservice.user}")
private String webserviceUser;

what sets the webserviceUser field to property webservice.user from property file/property placeholder.

How to do that with CDI? I've tried to find some answer, but I couldn't find any equivalent. However, people write, you can use CDI as Spring substitute on application servers, and that use case is very basic, so surely there must be an easy way, unfortunately I've failed to find it.

like image 691
Web Devie Avatar asked Jul 23 '13 07:07

Web Devie


People also ask

What does @value mean in spring?

Spring @Value annotation is used to assign default values to variables and method arguments. We can read spring environment variables as well as system variables using @Value annotation. Spring @Value annotation also supports SpEL.

What is CDI in spring boot?

1. Overview. CDI (Contexts and Dependency Injection) is a standard dependency injection framework included in Java EE 6 and higher. It allows us to manage the lifecycle of stateful components via domain-specific lifecycle contexts and inject components (services) into client objects in a type-safe way.

What is JSF CDI?

Contexts and Dependency Injection (CDI) primarily integrates with JavaServer Faces (JSF) through the Expression Language (EL). It enables CDI beans to be exposed through the unified EL-to-JSF components. It also provides a built-in context for conversation scope that is active during standard JSF life cycle phases.


1 Answers

CDI is a specification about Dependecy Injection and Context so it doesn't have such configuration things out of the box. But it also provides a very powerful extension mechanism that allows third party projects to add new portable features (i.e that works with all CDI implementation and that are not tied to a server). The most important project providing CDI extensions is Apache Deltaspike and good news, it provides what you need.

So you need to add deltaspike-core in your project. If you use Maven, you need to add this dependencies to your pom.xml

    <dependency>
        <groupId>org.apache.deltaspike.core</groupId>
        <artifactId>deltaspike-core-api</artifactId>
        <version>0.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.deltaspike.core</groupId>
        <artifactId>deltaspike-core-impl</artifactId>
        <version>0.4</version>
    </dependency> 

After that if you don't care about your properties filename, just add META-INF/apache-deltaspike.properties to your project and put your properties in it. If you need more than one file or want to choose the name you'll have to implement PropertyFileConfig interface for each file like this :

public class MyCustomPropertyFileConfig implements PropertyFileConfig
{
    @Override
    public String getPropertyFileName()
    {
        return "myconfig.properties";
    }
} 

After that you'll be able to inject values like this

@ApplicationScoped
public class SomeRandomService
{
    @Inject
    @ConfigProperty(name = "endpoint.poll.interval")
    private Integer pollInterval;

    @Inject
    @ConfigProperty(name = "endpoint.poll.servername")
    private String pollUrl;

    ...
 }

As you see in this example taken from Deltaspike documentation, you can inject your value in String but also in Integer, Long, Float, Boolean fields. You could provide your own type if you need something more specific. Deltaspike config documentation can be found here.

like image 90
Antoine Sabot-Durand Avatar answered Nov 05 '22 17:11

Antoine Sabot-Durand