我在我的网络应用程序端使用Google Gson(gson)库形式读取/写入json文件和spring mvc 3。
所以在控制器中,我想用漂亮的打印创建一个Gson的单例实例。在java中,代码是
Gson gson = new GsonBuilder().setPrettyPrinting().create();
在Controller中,我创建了一个自动连接的条目,如下所示,
@Autowired
private Gson gson;
和xml bean配置如下,
<bean id="gsonBuilder" class="com.google.gson.GsonBuilder">
<property name="prettyPrinting" value="true"/>
</bean>
<bean id="gson" factory-bean="gsonBuilder" factory-method="create"/>
它会在catalina日志中抛出以下异常,
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'prettyPrinting' of bean class [com.google.gson.GsonBuilder]: Bean property 'prettyPrinting' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1024)
at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:900)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358)
我知道setPrettyPrinting()的setter签名与spring期望的不同,这就是spring抛出异常的原因。
public GsonBuilder setPrettyPrinting() {
prettyPrinting = true;
return this;
}
但我无法找到一种方法来连接构建器模式bean。春天我很陌生。任何人都可以告诉我,是否有可能在xml bean方法中解决这个问题?
答案 0 :(得分:6)
只需使用in the documentation所述的静态工厂方法,并使用Java代码创建Java对象:它更容易和安全:
<bean id="gson"
class="com.foo.bar.MyGsonFactory"
factory-method="create"/>
并在MyGsonFactory中:
public static Gson create() {
return new GsonBuilder().setPrettyPrinting().create();
}
答案 1 :(得分:3)
setPrettyPrinting方法没有参数,因此它看起来不像java bean属性setter。这就是为什么你的方法不起作用的原因。您可以使用其他答案中提到的工厂方法,或者在配置文件中使用method invoking bean,如下所示:
<bean id="myStarter" class="org.springframework.beans.factory.config.MethodInvokingBean">
<property name="targetObject" ref="gsonBuilder"/>
<property name="targetMethod" value="setPrettyPrinting"/>
</bean>
工厂方法对我来说似乎更直接和惯用,但为了完整起见,我将这种方法包括在内。