java Spring Bean属性“xxx”不可写或具有无效的setter方法

8i9zcol2  于 2023-04-19  发布在  Java
关注(0)|答案(4)|浏览(104)

我是一个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定义:

<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'属性首先被评估)。
有谁能告诉我我哪里做错了吗?如果你愿意,请随意解释,因为我本身不是一个Spring的人。谢谢。

cygmwpex

cygmwpex1#

1)对于主机,应定义public getHost()setHost(String s)
方法,同样对于端口,您需要getPort()setPort(int v)方法。
这就是Spring初始化bean所需要的。
我认为它特别需要二传手(在这种情况下)。
或者...
2)可以将XML文件中的属性重命名为
carbonHostcarbonPort。这也应该可以。

u59ebvdq

u59ebvdq2#

问题是您在bean配置中使用了<property name="port" value="2023" />,但ExampleClass中对应的方法称为setCarbonPort(int port)
解决方案:将xml更新为<property name="carbonPort" value="2023" />或将方法更新为setPort(int port)

bf1o4zei

bf1o4zei3#

getter和setter必须是public的,任何其他访问级别都会导致错误。

v09wglhw

v09wglhw4#

属性元素对应于bean类公开的JavaBean setter方法。
bean中依赖项的setter和getter必须与property元素的name属性一致。
因此,在您的情况下,属性的name属性值为“host”,那么setter必须是“setHost()”而不是“setCarbonHost()”。但是,如果您希望将方法命名为“setCarbonHost()”,则属性只需要name属性值为“carbonHost”。

相关问题