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.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With