2014-02-06 2 views
6

Я новичок в Spring с простой проблемой Spring. Я работал над этим часами без везения. Вот исключение, а затем код (спасибо заранее):Свойство Spring Bean 'xxx' не доступно для записи или имеет неправильный метод setter

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; 
    } 
    // ===================================================== 
} 

я не включил здесь используется класс (основной метод). Хотя этот класс драйвера зависит от вышеуказанного класса, сам класс драйвера не имеет проблемы (я не верю).

Ошибка, указанная выше, показывает свойство «хозяина» как имеющее проблему, но, как вы могли ожидать, свойство «port» имеет такую ​​же проблему (так получилось, что сначала оценивается свойство «host»).

Может ли кто-нибудь сказать мне, где я ошибаюсь? Не стесняйтесь объяснять, если хотите, поскольку я не человек Весны, как таковой. Спасибо.

ответ

12

1) Для хоста вы должны определить общественные getHost() и setHost(String s)
методы, аналогично для порта вам нужно getPort() и setPort(int v) методы.

Это то, что Spring необходимо инициализировать вашим компонентом.

Я думаю, что в особенности это требует сеттер (в данном случае).

Или ...

2) Вы можете переименовать свойства в файле XML для

carbonHost и carbonPort. Это тоже должно сделать.

+0

Спасибо, Питер. Это сработало, и могу ли я сказать вам, что, судя по догадкам, я действительно попробовал это несколько часов назад. Это не так, но вы знаете, как идет отладка - я мог бы на мгновение изменить что-то еще, что все еще порождало ту же проблему. Для моего понимания: я предположил, что Spring (который я использовал только два дня) сопоставил свойство «name» с найденным методом, который устанавливает его. Но я предполагаю, что может быть любое количество методов, которое устанавливает значение свойства. Итак: если name = "fooBar", то ваши имена setter/getter должны быть setFooBar() и getFooBar()? –

+0

"Итак: если name =" fooBar ", то ваши имена сеттера/получателя должны быть установленыFooBar() и getFooBar()?" Именно, он ищет это соглашение об именах. И ... Итак, если ваше свойство someName, getter/setter должно быть установленоSomeName, getSomeName. Вы можете определить больше геттеров/сеттеров, но Spring ищет эти два. –

+0

также обратите внимание на чувствительность кейса, так как в моем случае я упомянул имя = «FooBar», что неверно – shabby

5

Проблема заключается в том, что вы используете <property name="port" value="2023" /> в конфигурации компонента, но соответствующий метод в ExampleClass называется setCarbonPort(int port).

Решение: обновите либо xml до <property name="carbonPort" value="2023" />, либо метод до setPort(int port).

2

Геттеры и сеттеры должны быть общедоступными, любой другой уровень доступа приведет к ошибке.

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

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