2013-12-06 1 views
1

Есть ли способ, чтобы Spring не выбрал исключение в нижнем регистре?Возможно ли, чтобы Spring проигнорировала свойство bean, которое не доступно для записи или имеет неверный метод setter

<bean id="myMain" class="pak.Main"> 
    <property name="name" value="myName"/> 
    <property name="age" value="100"/> 
    <property name="human" value="true"/> 
</bean> 


public class Main { 
    private String name; 
    private Integer age; 

    public void setName(String name) { 
    this.name = name; 
    } 

    public void setAge(Integer age) { 
    this.age = age; 
    } 

    public static void main(String[] args) { 
    new ClassPathXmlApplicationContext("beans.xml") 
     .getBean("myMain", Main.class); 
    } 
} 

Это брошено

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myMain' defined in class path resource [beans.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'human' of bean class [pak.Main]: Bean property 'human' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
+0

Вы не можете просто удалить свойство из определения компонента? – FGreg

+0

Тогда у меня не было бы вопроса, не так ли? :) – eigil

+0

Какой конкретный вариант использования? Могут быть много вариантов, но, как отмечали другие, если тип полностью известен, вам не нужно делать никаких «магии» для игнорирования свойств. –

ответ

2

Представьте себе мое удивление, что ответ да.

Введите InstantiationAwareBeanPostProcessor ... или более конкретно (и проще в использовании) InstantiationAwareBeanPostProcessorAdapter.

Этот обработчик столбцов вызывается перед созданием свойств в компоненте. Метод, который вы можете переопределить для достижения того, что вы пытаетесь сделать, - postProcessPropertyValues.

Этот метод предоставляет информацию о его компоненте и его свойствах. Затем вы можете модифицировать свойства компонента любым удобным для себя способом. В частности, существует метод PropertyValue.setOptional(boolean), который выглядит так, как будто вас это заинтересует.

Бросив вместе быстрый пример, используя свой сценарий, определить класс как таковой:

MyInstantiationAwareBeanPostProcessor.java:

import java.beans.PropertyDescriptor; 

import org.springframework.beans.BeansException; 
import org.springframework.beans.PropertyValue; 
import org.springframework.beans.PropertyValues; 
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter; 
import org.springframework.stereotype.Component; 

@Component 
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter { 

    @Override 
    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { 
     if (bean instanceof pak.Main) { 
      for (PropertyValue pv : pvs.getPropertyValues()) { 
       if ("human".equals(pv.getName())) { 
        pv.setOptional(true); 
       } 
      } 
     } 
     return pvs; 
    } 

} 

Затем убедитесь, что следующая строка в вашем контексте где-то:

<bean id="instantiationAwarePP" class="pak.MyInstantiationAwareBeanPostProcessor"/> 

И ты золотой.

P.S. Вам также может потребоваться определить <context:annotation-config /> в вашем контексте, чтобы послепроцессоры автоматически регистрировались ... но я не могу вспомнить, если это необходимо.

+0

Отлично, спасибо! не требуется. Одно замечание заключается в том, что я не мог просто расширить свой основной класс, что хорошо для некоторых других пост-процессоров. Для этого я должен был создать новый класс, как вы делаете в своем ответе. – eigil

Смежные вопросы

 Смежные вопросы