Свойство Spring Bean 'xxx' недоступно для записи или имеет недопустимый метод установки
Я новичок в Spring с, казалось бы, простой проблемой Spring. Я работал над этим часами без удачи. Вот исключение, за которым следует код (заранее спасибо):
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'graphiteWriterSession' defined in file [/home/user/resources/jmxtrans.graphite.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'host' of bean class [com.example.ExampleClass]: Bean property 'host' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
Мои бобовые определения:
<bean id="graphiteWriterSession" class="com.example.ExampleClass">
<property name="host" value="host.example.com" />
<property name="port" value="2023" />
<property name="namespacePrefix" value="apps.foo.bar" />
<property name="debug" value="true" />
</bean>
<bean id="jmxtransSession" class="com.example.MainMethodClass" factory-method="getInstance">
<property name="graphiteWriterSession" ref="graphiteWriterSession" />
</bean>
Фрагмент кода:
package com.example.ExampleClass;
import com.googlecode.jmxtrans.model.output.GraphiteWriter;
public class ExampleClass {
private static final long serialVersionUID = 1L;
private String host;
private int port;
private GraphiteWriter gw;
public ExampleClass() {
}
public GraphiteWriter getWriter() {
gw = new GraphiteWriter();
gw.addSetting(GraphiteWriter.PORT, port);
gw.addSetting(GraphiteWriter.HOST, host);
return gw;
}
// =====================================================
// set/get methods for Carbon host.
// Plugged into Spring application-context file.
// =====================================================
public void setCarbonHost( String host ) {
this.host = host;
}
public String getCarbonHost() {
return host;
}
// =====================================================
// =====================================================
// set/get methods for Carbon port.
// Plugged into Spring application-context file.
// =====================================================
public void setCarbonPort( int port ) {
this.port = port;
}
public int getCarbonPort() {
return port;
}
// =====================================================
}
Я не включил здесь класс драйвера (содержащий основной метод). Хотя этот класс драйверов зависит от вышеуказанного класса, сам класс драйверов не имеет проблем (я не верю).
Приведенная выше ошибка показывает, что свойство 'host' имеет проблему, но, как и следовало ожидать, свойство 'port' имеет ту же проблему (просто так случается, что свойство 'host' оценивается первым).
Может кто-нибудь сказать мне, где я иду не так? Не стесняйтесь объяснять, если хотите, так как я не Весенний человек как таковой. Спасибо.
5 ответов
1) Для хоста вы должны определить public getHost()
а также setHost(String s)
методы, аналогично для порта вам нужно getPort()
а также setPort(int v)
методы.
Это то, что нужно Spring для инициализации вашего компонента.
Я думаю, что он нуждается в установщике в частности (в данном случае).
Или же...
2) Вы можете переименовать свойства в вашем XML-файле в
carbonHost
а также carbonPort
, Это должно сделать это тоже.
Проблема в том, что вы используете <property name="port" value="2023" />
в вашей конфигурации бина, но соответствующий метод в ExampleClass
называется setCarbonPort(int port)
,
Решение: обновите xml до <property name="carbonPort" value="2023" />
или метод setPort(int port)
,
Методы получения и установки должны быть открытыми, любой другой уровень доступа вызовет ошибку.
Если мы используем пружинную загрузку и зависимость lombok от редактора, такого как sts/eclipse/intelliJ, нам нужно убедиться, что lombok настроен, это означает, что нам нужно установить lombok в sts и eclipse, а в intelliJ нам нужно включить обработку аннотаций, тогда только геттеры и сеттеры. будет генерироваться динамически. Я столкнулся с той же проблемой в sts, и у меня все работает отлично... Попробуйте установить ломбок
Элементы свойств соответствуют методам установки JavaBean, предоставляемым классами компонентов.
Методы установки и получения зависимостей в компоненте должны соответствовать атрибуту имени элемента свойства.
Следовательно, в вашем случае свойство имеет значение атрибута имени как «хост», тогда установщик должен быть «setHost()» вместо «setCarbonHost()». Однако, если вы хотите, чтобы ваш метод назывался только как «setCarbonHost()», тогда для свойства необходимо, чтобы значение атрибута имени было «carbonHost».