създаване на пролетен боб за обекти на модел на java builder

Използвам библиотеката на Google Gson(gson) за четене/запис на json файлове и пролетен 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() е различен от очаквания от пролетта, затова пролетта хвърля изключението.

  public GsonBuilder setPrettyPrinting() {
    prettyPrinting = true;
    return this;
  }

Но не мога да намеря начин да свържа зърната на шаблона за изграждане. Аз съм доста нов за пролетта. Може ли някой да ме уведоми дали е възможно да се реши този проблем в xml bean подход?


person appu    schedule 18.04.2015    source източник


Отговори (2)


Просто използвайте статичен фабричен метод, както е описано в документацията и използвайте Java код за създаване на Java обекти: това е много по-лесно и безопасно:

<bean id="gson"
      class="com.foo.bar.MyGsonFactory"
      factory-method="create"/>

и в MyGsonFactory:

public static Gson create() {
    return new GsonBuilder().setPrettyPrinting().create();
}
person JB Nizet    schedule 18.04.2015

Методът setPrettyPrinting не приема параметър, така че не изглежда като настройка на свойство на java bean. Ето защо вашият подход не проработи. Можете да използвате фабричния метод, споменат в другия отговор, или да използвате метод, извикващ bean в конфигурационния файл по следния начин:

 <bean id="myStarter" class="org.springframework.beans.factory.config.MethodInvokingBean">
   <property name="targetObject" ref="gsonBuilder"/>
   <property name="targetMethod" value="setPrettyPrinting"/>
 </bean>

Фабричният подход ми изглежда по-прост и идиоматичен, но включвам този подход за пълнота.

person Robert Moskal    schedule 18.04.2015
comment
1 Гласувайте „за“ за предлагането на подхода MethodInvokingBean. Никога не съм знаел за този подход - person appu; 18.04.2015
comment
Освен това, ако някой иска само xml конфигурация, може да използва този подход. Това ми хареса. - person appu; 18.04.2015