2010-12-10 3 views
2

У меня есть следующий класс:BeanUtils.copyProperties пренебрегая нулевые значения

import org.apache.commons.beanutils.BeanUtils; 
import com.thoughtworks.xstream.XStream; 
... 

public class MyBean { 
    protected static final XStream XSTREAM = new XStream(new DomDriver()); 

    protected String name; 
    protected Something something; 

    public MyBean() { 
     something = new Something(); 
    } 

    public MyBean(String xml) { 
     this(); 
     MyBean beanFromXML = (MyBean) XSTREAM.fromXML(new StringReader(xml)); 
     BeanUtils.copyProperties(this, beanFromXML); 
    } 

    public String toString() { 
     return XSTREAM.toXML(this); 
    } 

    // Getters and setters... 
} 

Это боб с возможностью сериализации и десериализации в/из XML с помощью XStream.

Я также добавил конструктор non-args, который инициализирует something, чтобы избежать ошибок с нулевым указателем. Боб на самом деле намного сложнее, и я не хочу проверять «something != null?». миллион раз.

Проблема возникает, когда я использую XML-конструктор. Допустим, я имею следующий XML:

<myBean> 
    <name>John</name> 
</myBean> 

Это то, что я хотел бы конструктор, чтобы сделать:

name: "John"; 
something: new Something(); 

Однако, так как нет <something> элемент в XML, BeanUtils.copyProperties марки something = null;, таким образом, что я получаю:

name: "John" 
something: null 

Как скопировать beanFromXML «s свойств в this ... но игнорируя NUL l вместо их перезаписи?

ответ

3

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

public class MyNullConverter implements Converter { 
    @Override 
    public Object convert(final Class type, final Object value) { 
    try { 
     return value == null ? type.newInstance() : value; 
    } catch (final InstantiationException e) { 
     return null; 
    } catch (final IllegalAccessException e) { 
     return null; 
    } 
    } 
} 

Затем зарегистрировать его для классов боба вы хотите по умолчанию (пустые) значения:

ConvertUtils.register(new MyNullConverter(), Something.class); 

Ваш код будет работать. Единственное, что может вас укусить, это то, что ваше Something инициализируется дважды. Не знаю, нормально ли это ...

BTW, если вы хотите более мелкозернистый контроль над процессом: вместо этого используйте BeanUtilsBean, PropertyUtilsBean и ConvertUtilsBean.

+0

Я попробую (но он будет ждать до следующего понедельника: D). Что касается инициализации, происходящей дважды, это не проблема, но в любом случае ее довольно легко решить. Благодаря!!! :) – AJPerez 2010-12-10 16:02:49

0

У вас есть методы псевдонима xstream для сопоставления имени свойства классу. После ссылка будет гораздо более полезным http://x-stream.github.io/alias-tutorial.html

+0

Это не то, что задал ОП .... Вопрос: «Как я могу скопировать свойства beanFromXML в это ... но игнорируя нулевые свойства, а не переписывая их?». – 2010-12-10 14:00:38