Home » Java » Spring: How do I inject ENUM in Spring configuration?

Spring: How do I inject ENUM in Spring configuration?

Posted by: admin December 28, 2021 Leave a comment

Questions:

I have a ENUM as

package com.myorg.sparrow.s3Environment;

import javax.annotation.Nonnull;

public enum DocumentType {
    Document("document/", ".xml.gz", "binary/octet-stream", "gzip", true);

    private final String path;
    private final String suffix;
    private final String contentType;
    private final String contentEncoding;
    private final Boolean compress;

    private DocumentType(@Nonnull final String path, @Nonnull final String suffix,
                         @Nonnull final String contentType, @Nonnull final String contentEncoding,
                         @Nonnull final Boolean compress) {
        this.path = path;
        this.suffix = suffix;
        this.contentType = contentType;
        this.contentEncoding = contentEncoding;
        this.compress = compress;
    }

    @Nonnull
    public String getPath() {
        return path;
    }

    @Nonnull
    public String getSuffix() {
        return suffix;
    }

    @Nonnull
    public String getContentType() {
        return contentType;
    }

    @Nonnull
    public String getContentEncoding() {
        return contentEncoding;
    }

    @Nonnull
    public Boolean isCompress() {
        return compress;
    }
}

I want to inject this value of DocumentType.Document in Spring configuration file

   <bean id="s3Service" class="com.myorg.sparrow.business.xml.persist.S3Service">
        <constructor-arg ref="awsCredentials" />
        <constructor-arg value="**DocumentType.DOCUMENT**" /> // how do I inject it here?
        <constructor-arg value="${com.myorg.sparrow.s3EnvironmentConfiguration.S3EnvironmentConfigurator-destBucketName}" />
    </bean>

How do I inject this value in

<constructor-arg value="**DocumentType.DOCUMENT**" /> // how do I inject it here?

I am very new to Spring framework and not sure how to achieve this

Thank you

Answers:
 <bean id="s3Service" class="com.myorg.sparrow.business.xml.persist.S3Service">
        <constructor-arg ref="awsCredentials" />
        <constructor-arg value="Document" /> // We love Spring because it is simpler than we expect
        <constructor-arg value="${com.myorg.sparrow.s3EnvironmentConfiguration.S3EnvironmentConfigurator-destBucketName}" />
    </bean>

###

Seems like you need to use “org.springframework.beans.factory.config.FieldRetrievingFactoryBean”

example:

<property name="b">
  <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <property name="targetClass" value="whole.package.path.A$B"></property>
    <property name="targetField" value="FIRST"></property>
  </bean>
</property>

References:

http://forum.springsource.org/showthread.php?19396-Accessing-enum-value-defined-in-inner-class

http://forum.springsource.org/showthread.php?19696-Spring-1-2-3-How-do-I-inject-Java-1-5-Enums