Podczas korzystania ze sprężyny, czy można ustawić właściwość tylko wtedy, gdy przekazana wartość nie jest pusta?Sprężyna - ustaw właściwość tylko wtedy, gdy jej wartość nie jest pusta
Przykład:
<bean name="myBean" class="some.Type">
<property name="abc" value="${some.param}"/>
</bean>
Zachowanie szukam jest:
some.Type myBean = new some.Type();
if (${some.param} != null) myBean.setAbc(${some.param});
Powodem muszę to od abc
ma wartość domyślną, która nie chce, aby zastąpić z a null
. A Groszek, który tworzę, nie znajduje się pod moją kontrolą źródła - więc nie mogę zmienić jego zachowania. (Również abc
do tego celu może być prymitywne, więc nie mogę ustawić go z zerem i tak
EDIT:.
Według odpowiedzi Myślę, że moje pytanie wymaga wyjaśnienia
ja. Mam komponent bean, który muszę utworzyć i przekazać do 3rd party, którego używam.Ten komponent ma wiele właściwości (12 obecnie) różnych typów (int
, boolean
, String
, itp.)
Każda właściwość ma wartość domyślną - nie wiem co to jest i wolałaby nie wiedzieć, chyba że stanie się problemem. To, czego szukam, to ogólne rozwiązanie, które pochodzi ze zdolności Springa - obecnie jedynym rozwiązaniem, jakie mam, jest refleksja.
Konfiguracja
<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>
Kod
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))
{
...
}
...
}
}
Prawdziwy "trudności" jest w trakcie realizacji convertToValue
dla wszystkich możliwych typów wartości. Zrobiłem to więcej niż jeden raz w życiu - więc nie jest to poważny problem, aby go wdrożyć dla wszystkich możliwych rodzajów, których potrzebuję (głównie prymitywów i kilku enum) - ale miałem nadzieję, że istnieje bardziej inteligentne rozwiązanie.
Dzięki za cynk - może to być pomocna w przyszłości, ale w moim przypadku nie mogę jej użyć - jak już wspomniałem, ten komponent bean nie znajduje się w mojej źródłowej kontroli - więc nie wiem, jaki jest jego domyślny (i nie chcę wiedzieć). Miałem nadzieję na coś z linii: '' –
RonK