Значение по умолчанию для аннотации spring @Value

#spring #properties #annotations #jndi #default-value

#spring #свойства #аннотации #jndi #значение по умолчанию

Вопрос:

У меня есть свойство с аннотацией @Value , обычно заполняемое из context.xml (jndi/tomcat)

 @Value("${some.property}")
private String property
  

Это работает нормально, но у нас есть установки нашего программного обеспечения, где это свойство не должно быть настроено.

Однако, если свойство отсутствует, я получаю javax.naming.NameNotFoundException: Name [some.property] is not bound in this Context. Unable to find [some.property]. , что логично.

Я попытался исправить это, добавив значение по умолчанию таким образом:

 @Value("${some.property:some_property_not_configured}")
private String property
  

Тем не менее, я все еще получаю ту же ошибку.

Есть идеи, как это предотвратить / исправить?

Я хотел бы использовать это в среде Spring 3.2.x и Spring 4 . Аннотация @Value доступна из Spring 3

ОБНОВЛЕНИЕ: проблема была не в аннотации @Value, а в app-config.xml

 <entry key="some.property">
    <jee:jndi-lookup jndi-name="java:comp/env/some.property" />
</entry>
  

Это вызвало ошибку во время запуска!

Однако, если я добавлю default-value="something" здесь, он все равно завершится с той же ошибкой

Комментарии:

1. вы проверили, что ваше some_property_not_configured является допустимым именем jndi

Ответ №1:

Я решил эту проблему, определив значение по умолчанию в свойстве-заполнителе И в аннотации @value:

 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties">
        <bean class="java.util.Properties">
            <constructor-arg>
                <map>
                    <entry key="some.property">
                        <jee:jndi-lookup jndi-name="java:comp/env/some.property" default-value="not_configured" />
                    </entry>
                </map>
            </constructor-arg>
        </bean>
    </property>
</bean>
  

и:

 @Value(value = "${some.property:not_configured}")
private String property;