Бины JSF и проблема сериализации
У меня проблема с компонентами JSF, использующими сервисы, управляемые Spring. Я получил сообщение о том, что bean-компонент Spring, используемый в JSF-компоненте, не сериализуем.
@ManagedProperty("#{customerService}")
private CustomerService customerService;
Я не могу сделать сериализуемую службу, потому что она использует JdbcTemplate
который сам по себе не сериализуем. Более того, сериализация бинов Spring, имеющих область применения, не имеет никакого смысла, поэтому я не понимаю, почему чей-то код пытается их сериализовать.
Я работал с проектом JSF с использованием сервисов Spring, и таких проблем не было, поэтому такое сотрудничество должно быть возможным. Но этот проект сделан с нуля на основе примеров проектов, поэтому, должно быть, что-то не так с конфигурацией сотрудничества Spring-JSF, но я не знаю, где искать.
Конфигурация Spring для JSF:
<!-- JSF and Spring are integrated -->
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
Как решить эту проблему?
1 ответ
Нет способа избежать тумана сериализации JSF. Даже бины ApplicationScoped сериализуются (когда они вводятся в другие бины).
Но решение было принято на стороне весны. Вы должны использовать прокси с областью действия.
Чтобы обернуть компонент в сериализуемый прокси, вы должны добавить его в тело компонента:
<aop:scoped-proxy proxy-target-class="true"/>
Весеннее пространство имен AOP и spring-aop
зависимость должна быть добавлена.
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
И это все! В bean-компоненте будет сериализуемый элемент, прокси, который будет перезагружать bean-компонент из контекста Spring при десериализации.
Единственный туман здесь заключается в том, что я должен создать прокси-сервер уровня класса cglib. JRE-прокси не работал, потому что интерфейс не был доступен во время десериализации... Я не совсем понимаю, почему, но у меня есть рабочее решение, по крайней мере.