用于java构建器模式对象的spring bean创建

时间:2015-04-18 15:33:30

标签: spring spring-mvc gson

我在我的网络应用程序端使用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方法中解决这个问题?

2 个答案:

答案 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>

工厂方法对我来说似乎更直接和惯用,但为了完整起见,我将这种方法包括在内。