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.
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.
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)
.
Les getters et setters doivent être publics, tout autre niveau d'accès entraînera l'erreur.