web-dev-qa-db-fra.com

La propriété Spring Bean 'xxx' n'est pas accessible en écriture ou possède une méthode de définition non valide

Je suis un débutant du printemps avec un problème de printemps apparemment simple. J'ai travaillé dessus pendant des heures sans chance. Voici l'exception, suivie du code (merci d'avance):

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?

Mes définitions de 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>

L'extrait de code:

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

Je n'ai pas inclus la classe driver (méthode principale contenant) ici. Bien que cette classe de pilotes dépende de la classe ci-dessus, la classe de pilotes elle-même n'a pas de problème (je ne crois pas).

L'erreur ci-dessus montre que la propriété 'Host' a le problème mais, comme vous pouvez vous y attendre, la propriété 'port' a le même problème (il se trouve que la propriété 'Host' est évaluée en premier).

Quelqu'un peut-il me dire où je me trompe? N'hésitez pas à expliquer si vous le souhaitez, car je ne suis pas une personne du printemps en soi. Je vous remercie.

10
NYCeyes

1) Pour Host, vous devez définir public getHost() et setHost(String s)
méthodes, de même pour le port, vous avez besoin des méthodes getPort() et setPort(int v).

C'est ce dont Spring a besoin pour initialiser votre bean.

Je pense qu'il a besoin du setter en particulier (dans ce cas).

Ou ...

2) Vous pouvez renommer les propriétés de votre fichier XML en

carbonHost et carbonPort. Cela devrait aussi le faire.

13
peter.petrov

Le problème est que vous utilisez <property name="port" value="2023" /> Dans votre configuration de bean, mais la méthode correspondante dans ExampleClass s'appelle setCarbonPort(int port).

Solution: mettez à jour le xml vers <property name="carbonPort" value="2023" /> Ou la méthode vers setPort(int port).

5
matsev

Les getters et setters doivent être publics, tout autre niveau d'accès entraînera l'erreur.

2
RancidVess