Подтвердить что ты не робот

Spring - установить свойство только в том случае, если значение не равно нулю

При использовании 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 для всех возможных типов значений. Я делал это не один раз в своей жизни, поэтому не важно выполнить его для всех возможных типов, которые мне нужны (в основном, примитивы и несколько перечислений), но я надеялся, что существует более интеллектуальное решение.

4b9b3361

Ответ 1

Вы можете использовать SpEL и заполнитель и значение по умолчанию для механизмов-заполнителей вместе следующим образом:

<bean name="myBean" class="some.Type">
    <property name="abc" value="${some.param:#{null}}"/>
</bean>

Ответ 2

Для решения вашей проблемы вы должны использовать 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

Ответ 3

Вы можете использовать концепцию значения по умолчанию в конфигураторе свойств в структуре 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 лучше утверждать, что член класса не имеет значения по умолчанию и значение по умолчанию, введенное из класса."

Ответ 4

Вы можете создать класс 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>

Ответ 6

У меня есть работа со следующим фрагментом:

<bean name="myBean" class="some.Type">
    <property name="abc" value="#{'${some.param}'=='' ? null : '${some.param}'}" />
</bean>