web-dev-qa-db-ja.com

Spring Beanプロパティ「xxx」は書き込み不可であるか、無効なセッターメソッドがあります

私は一見シンプルな春の問題を抱えている春の初心者です。私はこれに何時間も運をかけずに取り組みました。ここに例外があり、その後にコードが続きます(事前に感謝します):

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

ここには、ドライバー(含むメインメソッド)クラスを含めませんでした。そのドライバークラスは上記のクラスに依存しますが、ドライバークラス自体には問題はありません(信じられません)。

上記のエラーは「ホスト」プロパティに問題があることを示していますが、ご想像のとおり、「ポート」プロパティにも同じ問題があります(「ホスト」プロパティが最初に評価されるのは偶然です)。

誰が私が間違っているのか教えてもらえますか?私がSpringの人ではないので、あなたが望むなら、自由に説明してください。ありがとうございました。

10
NYCeyes

1)ホストでは、パブリックgetHost()およびsetHost(String s)を定義する必要があります
メソッド。ポートについても同様に、getPort()およびsetPort(int v)メソッドが必要です。

これは、SpringがBeanを初期化するために必要なものです。

特にセッターが必要だと思います(この場合)。

または...

2)XMLファイルのプロパティの名前を

carbonHostおよびcarbonPort。これもそれを行う必要があります。

13
peter.petrov

問題は、Bean構成で_<property name="port" value="2023" />_を使用しているが、ExampleClassの対応するメソッドがsetCarbonPort(int port)と呼ばれることです。

解決策:xmlを_<property name="carbonPort" value="2023" />_に更新するか、メソッドをsetPort(int port)に更新します。

5
matsev

ゲッターとセッターはパブリックである必要があります。他のアクセスレベルではエラーが発生します。

2
RancidVess