Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring - set a property only if the value is not null

When using Spring, is it possible to set a property only if the value passed is not null?

Example:

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

The behavior I'm looking for is:

some.Type myBean = new some.Type(); if (${some.param} != null) myBean.setAbc(${some.param}); 

The reason I need this is since abc has a default value which I don't want to override with a null. And the Bean I am creating is not under my source control - so I cannot change its behavior. (Also, abc for this purpose might be a primitive, so I can't set it with a null anyway.

EDIT:
According to the answers I think my question requires clarification.

I have bean I need to instantiate and pass to 3rd party I use. This bean has many properties (12 currently) of various types (int, boolean, String, etc.)
Each property has a default value - I don't know what it is and would prefer not needing to know unless it becomes an issue. What I'm looking for is a generic solution that comes from Spring's abilities - currently the only solution I have is a reflection based.

Configuration

<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> 

Code

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))         {           ...         }         ...     } } 

The real "difficulty" is in implementing convertToValue for all possible value types. I have done this more than once in my life - so it is not a major issue to implement it for all possible types that I need (mostly primitives and a few enums) - but I hoped a more intelligent solution existed.

like image 741
RonK Avatar asked Feb 19 '12 08:02

RonK


1 Answers

You can use SpEL and placeholder and default value for placeholder mechanisms together as following:

<bean name="myBean" class="some.Type">     <property name="abc" value="${some.param:#{null}}"/> </bean> 
like image 162
Sam Avatar answered Sep 28 '22 03:09

Sam