Ответ 1
Вы можете использовать SpEL
и заполнитель и значение по умолчанию для механизмов-заполнителей вместе следующим образом:
<bean name="myBean" class="some.Type">
<property name="abc" value="${some.param:#{null}}"/>
</bean>
При использовании Spring можно ли установить свойство только в том случае, если переданное значение не является нулевым?
Пример:
<bean name="myBean" class="some.Type">
<property name="abc" value="${some.param}"/>
</bean>
Поведение, которое я ищу, это:
some.Type myBean = new some.Type();
if (${some.param} != null) myBean.setAbc(${some.param});
Я нуждаюсь в этом, так как abc
имеет значение по умолчанию, которое я не хочу переопределять с помощью null
.
И Bean, который я создаю, не находится под моим контролем источника, поэтому я не могу изменить его поведение. (Кроме того, abc
для этой цели может быть примитивным, поэтому я никак не могу установить его с нулем.
EDIT:
Согласно ответам, я думаю, что мой вопрос требует уточнения.
У меня Bean Мне нужно создать экземпляр и передать третьим лицам, которых я использую. Этот Bean имеет множество свойств (в настоящее время 12) различных типов (int
, boolean
, String
и т.д.)
Каждое свойство имеет значение по умолчанию - я не знаю, что это такое и предпочел бы не знать, если это не станет проблемой.
То, что я ищу, - это общее решение, которое приходит из Spring способностей - в настоящее время единственным решением, которое у меня есть, является основанный на размышлении.
Конфигурация
<bean id="myBean" class="some.TypeWrapper">
<property name="properties">
<map>
<entry key="abc" value="${some.value}"/>
<entry key="xyz" value="${some.other.value}"/>
...
</map>
</property>
</bean>
код
public class TypeWrapper
{
private Type innerBean;
public TypeWrapper()
{
this.innerBean = new Type();
}
public void setProperties(Map<String,String> properties)
{
if (properties != null)
{
for (Entry<String, Object> entry : properties.entrySet())
{
String propertyName = entry.getKey();
Object propertyValue = entry.getValue();
setValue(propertyName, propertyValue);
}
}
}
private void setValue(String propertyName, Object propertyValue)
{
if (propertyValue != null)
{
Method method = getSetter(propertyName);
Object value = convertToValue(propertyValue, method.getParameterTypes()[0]);
method.invoke(innerBean, value);
}
}
private Method getSetter(String propertyName)
{
// Assume a valid bean, add a "set" at the beginning and toUpper the 1st character.
// Scan the list of methods for a method with the same name, assume it is a "valid setter" (i.e. single argument)
...
}
private Object convertToValue(String valueAsString, Class type)
{
// Check the type for all supported types and convert accordingly
if (type.equals(Integer.TYPE))
{
...
}
else if (type.equals(Integer.TYPE))
{
...
}
...
}
}
Реальная "трудность" заключается в реализации convertToValue
для всех возможных типов значений.
Я делал это не один раз в своей жизни, поэтому не важно выполнить его для всех возможных типов, которые мне нужны (в основном, примитивы и несколько перечислений), но я надеялся, что существует более интеллектуальное решение.
Вы можете использовать SpEL
и заполнитель и значение по умолчанию для механизмов-заполнителей вместе следующим образом:
<bean name="myBean" class="some.Type">
<property name="abc" value="${some.param:#{null}}"/>
</bean>
Для решения вашей проблемы вы должны использовать SEL (Spring Язык выражений). С помощью этой функции (добавленной в SPring 3.0) вы можете использовать другой динамический язык, записывающий ваше состояние. Ответ на ваш вопрос:
<bean name="myBean" class="some.Type">
<property name="abc" value="#(if(${some.param} != null) ${some.param})"/>
</bean>
для получения дополнительной информации см. (в этом учебнике указано, что используется SEL в файле контекста): http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html
Вы можете использовать концепцию значения по умолчанию в конфигураторе свойств в структуре Spring следующим образом:
<bean name="myBean" class="some.Type">
<property name="abc" value="${some.param : your-default-value}"/>
</bean>
вы можете установить значение по умолчанию таким образом. В этом контексте config, если существует ключ some.param
, поэтому его значение устанавливается в свойстве abc
и если не существует your-default-value
, установленного в abc
.
Примечание. Еще одно преимущество этого подхода: "В модели программирования POJO лучше утверждать, что член класса не имеет значения по умолчанию и значение по умолчанию, введенное из класса."
Вы можете создать класс Utility, который будет действовать как класс Factory для some.Type
, и обернуть туда логику
Пример:
public class TypeFactory {
public static Type craeteType(SomeType param){
Type t = new Type();
if(param!=null)
t.setParam(param);
}
}
и на XML настройте создание bean с помощью этого метода Factory
<bean id="myBean" class="some.Type"
factory-method="craeteType">
<constructor-arg ref="param"/>
</bean>
Это выглядит как работа для Конфигурация контейнера на Java. Вы сможете делать то, что вы делаете в своей конфигурации XML, но со всей мощью Java.
У меня есть работа со следующим фрагментом:
<bean name="myBean" class="some.Type">
<property name="abc" value="#{'${some.param}'=='' ? null : '${some.param}'}" />
</bean>