Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring 4 IoC и Java 8 - как иньектить конструктор?


Автор: Се ля ви 21.6.2014, 14:12
(До сих пор почему-то у нас нету отдельного форума по Spring`у, по-этому звиняйте - пишу сюда, поскольку от базовой Java это всё-таки дальше, ближе всего - к тематике Java EE)

Знаю, что XML-конфиги в Spring`е постепенно умирают (как минимум - не поддерживают generics), но пока не успел перестроиться на Groovy, пытаясь все текущие проблемы всё-таки как-то решать в рамках XML.

И вот встал новый вопрос - использую Java 8  со всеми её прелестями, в частности, указателями на функции. Необходимо при помощи Spring IoC через XML-конфиг иньектнуть в private`ное поле класса указатель на функцию (в моём конкретном случае - на контруктор).

Пишу:
Код
<?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:context="http://www.springframework.org/schema/context"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                                                          http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                                                      http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- ... -->
    <bean id="atsConverter" class="ru.atc.bi.sd.transfer.excel.ExcelToCvsСonverter"
          p:generator="NoremReportRow::new"/>
    <!-- ... -->
</beans>

где ключевой момент - именно строка, являющаяся указателем на конструктор класса NoremReportRow:
p:generator="NoremReportRow::new"

Ругань возникает следующая:
Код
Exception in thread "main"
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'atsConverter'
defined in class path resource [spring-config.xml]: Initialization of bean failed; nested
exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value
of type 'java.lang.String' to required type 'java.util.function.Function' for property 'generator'; nested
exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type
[java.util.function.Function] for property 'generator': no matching editors or conversion strategy found...


Кто-нибудь с подобным сталкивался? Есть соображения, как лечить?

Автор: Се ля ви 24.6.2014, 12:07
В общем, пока не нашёл ничего лучше, кроме как по-старинке, как в Java 7 работать - создавать в отдельных файлах реализацию функционального интерфейса и передавать его экземпляр как именованного класса... И изучать Groovy и переходить в своих проектах с XML-конфигов на Groovy-конфиги в надежде на то, что там такой проблемы не будет...

Автор: Се ля ви 8.7.2014, 20:06
Нашёл несколько более элегантное решение - т.к. по-умолчанию все bean`ы Spring - это singleton`ы (и этого, как правило, достаточно), можно вытаскивать их по нескольку раз.

Вот я и вытаскиваю предварительно их вначале - и инъектю то, что надо, что бы при последующих доставаниях оно там уже было.

Более элегантно это можно сделать через BeanFactoryPostProcessor, но пока всё никак руки не доходят этим заняться...

Автор: Kircul 9.7.2014, 00:44
Я конечно мало чего понял из описания, но мне что-то подсказывает что для достижения цели надо использовать factory method: http://docs.spring.io/spring/docs/4.0.5.RELEASE/spring-framework-reference/html/beans.html#beans-factory-class-instance-factory-method

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)