Spring: исключение NotWritablePropertyException

#java #spring #dependency-injection #spring-test #spring-test-mvc

#java #весна #внедрение зависимостей #spring-тест #spring-test-mvc

Вопрос:

ApplicationContext

 <bean id="contentRegisteringBean" parent="abstractRegisteringBean" lazy-init="false">
    <property name="processor">
        <bean class="com.somepackage.ContentService$Processor"/>
    </property>
</bean>

<bean id="abstractRegisteringBean" class="test.spring.MockFactoryBean">
    <property name="type" value="com.somepackage.ProcessorRegisteringBeanImpl"/>
</bean>
  

ProcessorRegisteringBeanImpl

 public class ProcessorRegisteringBeanImpl {
    private Processor mProcessor;


    public Processor getProcessor() {
        return mProcessor;
    }

    public void setProcessor(final Processor processor) {
        mProcessor = processor;
    }
}
  

MockFactoryBean.java

 public class MockFactoryBean<T> implements FactoryBean<T> {
    private Class<T> type;

    public void setType(Class<T> type) {
        this.type = type;
    }

    @Override
    public T getObject() throws Exception {
        return Mockito.mock(type);
    }

    @Override
    public Class<T> getObjectType() {
        return type;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

}
  

Исключение:

org.springframework.beans.Исключение NotWritablePropertyException: недопустимое свойство ‘processor’ класса bean [test.spring.MockFactoryBean]: свойство компонента ‘processor’ недоступно для записи или имеет недопустимый метод установки. Соответствует ли тип параметра средства установки типу возвращаемого средства получения?

Комментарии:

1. Что такое MockFactoryBean ?

2. @axtavt посмотрите на обновленный вопрос, пожалуйста

Ответ №1:

Когда вы объявляете FactoryBean , Spring ожидает, что вы настроите свойства FactoryBean , а не свойства объекта, который он создает.

Вместо этого попробуйте следующее:

 <bean id="contentRegisteringBean" parent="abstractRegisteringBean" lazy-init="false">
    <!-- Define concrete class to pass to Mockito.mock() -->
    <constructor-arg value = "com.somepackage.ProcessorRegisteringBeanImpl" />

    <property name="processor">
        <bean class="com.somepackage.ContentService$Processor"/>
    </property>
</bean>

<!-- Abstract definition of beans created using Mockito.mock() -->
<bean id="abstractRegisteringBean" abstract = "true"
     class="org.mockito.Mockito" factory-method = "mock">
</bean>
  

Комментарии:

1. пожалуйста, больше объяснений. Почему?