Spring 3.1 ConversionServiceFactoryBean ломает плитку ViewResolver - PullRequest
1 голос
/ 16 января 2012

У меня есть небольшое приложение Spring (3.1.0.RELEASE), которое работало просто отлично, пока я не решил, что мне нужен конвертер для преобразования содержимого из строк в другие типы.

Файл контекста моего приложения содержит другой файл mvc-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:p="http://www.springframework.org/schema/p"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <mvc:annotation-driven />
    <mvc:view-controller path="/" view-name="index"/>
    <mvc:resources mapping="/resources/**" location="/resources/"/>

    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    </mvc:interceptors>

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
       <property name="defaultLocale" ref="finnishLocale"/>
    </bean>
    <bean id="finnishLocale" class="java.util.Locale">
       <constructor-arg index="0" value="fi" />
    </bean>

   <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"
      p:definitions="/WEB-INF/config/tiles-config.xml"/>

   <bean id="tilesViewResolver" class="org.springframework.js.ajax.AjaxUrlBasedViewResolver">
       <property name="viewClass" value="org.springframework.webflow.mvc.view.FlowAjaxTilesView"/>
   </bean>

</beans>

Это отлично работает. Проблема возникает, когда я добавляю следующее определение компонента в указанный выше файл:

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="fi.mydomain.app.converter.StringToClassConverter"/>
        </list>
    </property>
</bean>

(Кстати, это точно такой же bean-компонент, который показан в документации Spring, за исключением класса конвертера). Я также изменил строку, управляемую аннотациями, так:

<mvc:annotation-driven conversion-service="conversionService"/>

(Проблема возникает, однако, просто путем добавления bean-компонента translationService).

(у меня также есть класс fi.mydomain.app.converter.StringToClassConverter).

Проблема в том, что теперь приложение больше не может быть развернуто. В файле журнала отображается сообщение об ошибке:

2012-01-16 17:55:30,427 [http-8080-7] ERROR ContextLoader.initWebApplicationContext() - Context initialization failed
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'tilesViewResolver' defined in ServletContext resource [/WEB-INF/config/mvc-config.xml]:
Error setting property values; nested exception is  org.springframework.beans.PropertyBatchUpdateException;
nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException:
Property 'viewClass' threw exception; nested exception is java.lang.IllegalArgumentException:
Given view class [null] is not of type 
[org.springframework.web.servlet.view.AbstractUrlBasedView]

И когда я удаляю bean-компонент translationService из xml, все снова работает, за исключением того, что я не могу использовать свои собственные конвертеры.

Я провел часы с этим безрезультатно. Любая помощь будет оценена. Спасибо.

- Ханну

1 Ответ

2 голосов
/ 17 января 2012

Я обнаружил, что проблема возникает из моего конвертера. Это было определено так:

final class StringToClassConverter implements Converter<String, Class>, InitializingBean {

    private Map<String, Class> map = new HashMap<String, Class>();

    public Class convert(String key) {
       return map.get(key);
    }

    public void afterPropertiesSet() throws Exception {
        map.put("organizations", Class.forName("fi.mydomain.app.domain.Organization"));
        map.put("invoices", Class.forName("fi.mydomain.app.domain.Invoice"));
    }
}

Это дало мне симптомы, описанные в оригинальном вопросе. Когда я изменил конвертер на это:

final class StringToClassConverter implements Converter<String, Object>, InitializingBean {

    private Map<String, Object> map = new HashMap<String, Object>();

    public Object convert(String key) {
       return map.get(key);
    }

    public void afterPropertiesSet() throws Exception {
        map.put("organizations", Class.forName("fi.mydomain.app.domain.Organization"));
        map.put("invoices", Class.forName("fi.mydomain.app.domain.Invoice"));
    }
}

То есть после того, как я заменил Class на Object, приложение снова начало работать. Я не понимаю, что не так в первом конвертере, и я не совсем доволен решением, но я думаю, что это придется сделать сейчас.

- Ханну

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...