Форум программистов, компьютерный форум CyberForum.ru

Java EE (J2EE)

Войти
Регистрация
Восстановить пароль
 
dalay_lama
70 / 70 / 10
Регистрация: 22.09.2012
Сообщений: 453
#1

SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации - Java EE

10.12.2016, 09:00. Просмотров 396. Ответов 12
Метки нет (Все метки)

Всем доброго времени суток. Имеется приложение spring-boot-mvc. Конфигурация контекста частично задана аннотациями, частично в xml-е. Проблема моя в следующем: в xml-конфигурации задано 3 бина datasource(для oracle, для sqlserver и postgre) и бин jdbcTemplate, поясню для чего их три - приложение умеет работать с 3-мя базами и просто для удобства я сразу задал 3 бина, чтобы когда нужно было переключиться на другую базу, не нужно было переписывать настройки подключения к БД, все 3 объявлены ленивой инициализацией и в зависимости от того, какое подключение мне нужно, передаю подключение в конструктор бина jdbc.

data-source-configuration.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<bean id="postgresqlDataSource" class="org.postgresql.ds.PGPoolingDataSource" lazy-init="true">
        <property name="user" value="postgres" />
        <property name="password" value="postgres" />
        <property name="serverName" value="127.0.0.1" />
        <property name="databaseName" value="test" />
        <property name="portNumber" value="5432" />
    </bean>
 
    <bean id="oracleDataSource" class="oracle.jdbc.pool.OracleDataSource" lazy-init="true">
        <property name="driverType" value="thin" />
        <property name="user" value="test" />
        <property name="password" value="server3" />
        <property name="serverName" value="127.0.0.1
        <property name="databaseName" value="XE" />
        <property name="portNumber" value="1521" />
    </bean>
 
    <bean id="sqlserverDataSource" class="com.microsoft.sqlserver.jdbc.SQLServerXADataSource" lazy-init="true">
        <property name="user" value="test" />
        <property name="password" value="test
        <property name="serverName" value="127.0.0.1
        <property name="instanceName" value="SQLSRV" />
        <property name="databaseName" value="ju
        <property name="portNumber" value="1433" />
    </bean>
 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg name="dataSource" ref="oracleDataSource" />
    </bean>
Ошибка возникает при запуске приложения. Ругается на автосвязовании в restcontroller-е:
Java
1
2
3
4
5
6
7
@RestController
@RequestMapping("/foms")
public class FomsRestController {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    /**......*/
}
А ругается он вот так -
Код
Field jdbcTemplate in ru.next.report.server.restcontroller.FomsRestController required a single bean, but 3 were found:
	- postgresqlDataSource: defined in URL [file:configuration/data-source-configuration.xml]
	- oracleDataSource: defined in URL [file:configuration/data-source-configuration.xml]
	- sqlserverDataSource: defined in URL [file:configuration/data-source-configuration.xml]
Т.е. получается, что он на jdbcTemplate пытается привязать dataSource, но при чём тут он вообще? Если оставить только один бин для dataSource тогда всё окей, но хотелось бы разобраться, почему такая ерунда происходит?

Так выглядит запуск приложения:
Java
1
2
3
4
5
6
7
8
9
10
@SpringBootApplication
@ImportResource("file:configuration/next-report-context.xml")
public class Server {
 
    public static final String FILE_ENCODING = "UTF-8";
 
    public static void main(String[] args) {
        SpringApplication.run(Server.class, args);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2016, 09:00     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации
Посмотрите здесь:

конфигурация wicket в web.xml - Java EE
Привет кодеры! Пытаюсь изучить данный фреймворк, но печаль в том что мои кривые руки даже хеллоу ворд реализовать не могут. Проблема в том...

Springboot vs jetty - Java EE
Здравствуйте! Стоит задача написать простое web приложение для конфигурации удаленных компьютеров. Что лучше использовать в...

Отображение jsp в SpringBoot - Java EE
Здравствуйте. Пишу простое mvc приложение на Spring Boot. Столкнулся с проблемой, на которую не могу найти решения. Прошу помощи. В...

Аннотации JPA - Java EE
Здравствуйте, всем! Ребята подскажите пожалуйста как правильно аннотировать. есть таблица скажем T1, в нем есть поля (id, name) так...

Spring и аннотации @Configuration & @Autowired - Java EE
Здравствуйте! Не могу найти ответ на свой вопрос, подскажите возможно ли такое. При работе с веб проектом всю конфигурацию бинов...

JPA аннотации и версия библиотеки для клиента - Java EE
Интересует вопрос как правильно поступают в такого рода приложениях. Предварительные условия: допустим есть некая сущность Book,...

Tomcat DataSource конфигурация - Java EE
Уважаемые как сконфигурировать DataSource Для томкат и PostgreSQL? У них написано что типа если хотите чтобы ваши сеттинги были видны...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,211
10.12.2016, 11:15     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #2
Цитата Сообщение от dalay_lama Посмотреть сообщение
required a single bean, but 3 were found
русским по белому же. Нужен один а есть 3. Хз какой бин тащить. Такое поведение как вы хотите легко конфигурируется с помощью аннотации @Bean + @Configuration, либо @Conditional
dalay_lama
70 / 70 / 10
Регистрация: 22.09.2012
Сообщений: 453
10.12.2016, 13:03  [ТС]     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #3
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
русским по белому же. Нужен один а есть 3. Хз какой бин тащить.
я понимаю, что там написано, вы обратили внимание какому типу объекта я делаю автопривязку? и какие 3 бина он мне предлагает? я пытаюсь привязать jdbcTemplate, для него есть бин, он один, но он мне говорит - "у меня есть 3 бина dataSource, не понимаю, какой тебе нужен".

Добавлено через 21 минуту
В общем, я разобрался в чём прикол был, опишу, может кому пригодится.
Spring Boot видел зависимости(dependency) для jdbcTemplate и создавал свои бины для JdbcTemplate и DataSource.
В файле конфигурации эти бины тоже создавались(datasoruce-ы и jdbctemplate), но автосвязывание подставляло jdbcTemplate созданный spring boot-ом - отсюда и путаница, что создаваемый spring boot jdbctemplate не знал каким бином datasource-а инициализироваться, вот и получалась ошибка. Решение: исключить создание бинов в spring boot, т.к. мне нужны свои:
Java
1
2
3
4
5
6
7
8
9
10
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, JdbcTemplateAutoConfiguration.class})
@ImportResource("file:configuration/next-report-context.xml")
public class Server {
 
    public static final String FILE_ENCODING = "UTF-8";
 
    public static void main(String[] args) {
        SpringApplication.run(Server.class, args);
    }
}
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
12.12.2016, 01:01     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #4
dalay_lama, есть еще несколько решений - не смешивать аннотации и xml, использовать Primary или Qualifier
dalay_lama
70 / 70 / 10
Регистрация: 22.09.2012
Сообщений: 453
12.12.2016, 13:30  [ТС]     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #5
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
не смешивать аннотации и xml
в рамках текущей задачи как раз было необходимо использовать аннотации и xml конфигурации - это удобно.
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
12.12.2016, 14:03     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #6
dalay_lama, чем же это удобно ? потом вылазит непонятная хрень и ты не понимаешь где и что искать, все, что вы пишите в xml можно заменить аннотациями, которые куда более удобно читаемые, тоже самое и с аннотациями, в случае необходимости, все можно заменить на xml, но смешивать это не рекомендуется
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,211
12.12.2016, 14:09     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #7
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
тоже самое и с аннотациями, в случае необходимости, все можно заменить на xml
это не так. Есть вещи которые невозможно сделать через xml конфиг.
dalay_lama
70 / 70 / 10
Регистрация: 22.09.2012
Сообщений: 453
12.12.2016, 14:23  [ТС]     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #8
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
чем же это удобно ?
не знаю как вам конечно, но мне удобнее создавать бины через xml конфигурации, т.к. при необходимости, я в любой момент могу заменить один бин на другой, без перекомпиляции приложения. если я всё буду создавать через аннотации, тогда всё жестко будет зашито в коде. Аннотации я использую в основном для автопривязывания.

Цитата Сообщение от Fene4ka_ Посмотреть сообщение
потом вылазит непонятная хрень и ты не понимаешь где и что искать
Ну, если не понимаешь, что делаешь, то да, будет не понятно.

Цитата Сообщение от Fene4ka_ Посмотреть сообщение
что вы пишите в xml можно заменить аннотациями, которые куда более удобно читаемые
это довольно субъективное утверждение.
Fene4ka_
89 / 89 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
12.12.2016, 14:50     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #9
Цитата Сообщение от dalay_lama Посмотреть сообщение
Ну, если не понимаешь, что делаешь, то да, будет не понятно.
привычка писать код только для себя - плохая привычка, иначе бы не придумали ооп.
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Есть вещи которые невозможно сделать через xml конфиг.
можно привести пример для общего развития ?
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,211
12.12.2016, 15:25     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #10
Цитата Сообщение от dalay_lama Посмотреть сообщение
если я всё буду создавать через аннотации, тогда всё жестко будет зашито в коде.
это если вы будите делать кривую конфигурацию. При правильном конфиге при желании можно даже без перезагрузки сервера обойтись

Цитата Сообщение от Fene4ka_ Посмотреть сообщение
можно привести пример для общего развития ?
всякие условные бины. Например я хочу чтобы на тестовых серверах поднимался тестовый бин отвечающий за оплату. Это ещё как то можно сделать через xml, передав другой конфиг, но если я хочу чтобы тестовый бин поднимался только по четвергам например, на xml такого уже не напишешь
dalay_lama
70 / 70 / 10
Регистрация: 22.09.2012
Сообщений: 453
12.12.2016, 16:47  [ТС]     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #11
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
привычка писать код только для себя - плохая привычка, иначе бы не придумали ооп.
эм, что? причем здесь код под себя и ооп? где вы здесь увидели код для себя? я использую spring boot, это предполагает, что человек, который захочет разобраться/изменить/добавить будет понимать как работает spring boot и что он делает, если я использую ооп, он предполагает, что человек, который захочет разобраться/изменить/добавить будет понимать как работает ооп и т.д. и т.п.
Вообще не понял вашего замечения

Добавлено через 26 минут
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
это если вы будите делать кривую конфигурацию.
через аннотации у меня объявлены 2 бина реализации одного итерфейса. Через Qualifier я указал, какой конкретно бин мне нужен, скомпилировал приложение. в какой-то прекрасный момент я решил, что хочу использовать другой бин? как мне это сделать без перекомпиляции? при создании бинов проверять входные параметры и выбирать реализацию через условные выражения?
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,211
12.12.2016, 17:41     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #12
Цитата Сообщение от dalay_lama Посмотреть сообщение
Через Qualifier я указал, какой конкретно бин мне нужен
в этом и проблема

Цитата Сообщение от dalay_lama Посмотреть сообщение
при создании бинов проверять входные параметры и выбирать реализацию через условные выражения?
можно так, а можно использовать аннотацию @Conditional. Она позволяет делать довольно интересные вещи. Например приносить реализацию бина в зависимости от наличия \ отсутствия какого либо другого бина и.т.д
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2016, 03:26     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации
Еще ссылки по теме:

.NET 4.x Конфигурация приложения .NET. XML конфигурация - .NET
Здравствуйте. Третьи сутки колдую над конфигурацией приложения, написанного на шарпе. Перелопатил кучу инфы, но так и не понял, как её...

Не работает конфигурация ASUS P5K и Intel Q6600 - Компьютерное железо
Доброго времени суток. Ребята, помогите разобраться. У меня конфигурация: мать ASUS P5K, socet 775, процессор Intel Q6600, процессорный...

Динамическая или статическая конфигурация. Когда используется альтернативная IP-конфигурация? - Администрирование Windows
1) Когда одна сеть использует протокол DHCP для своих IP-адресов, а в другой сети используются статические IP-адреса 2) После того как...

Аннотации - Java SE
Town.createUpdate(Town.class); import org.apache.logging.log4j.Level; public class Town extends Entity{ Town(String arg_0){ ...

Php аннотации - PHP
Всем здравствуйте) Начал изучать symfony framework и столкнулся с аннотациями. Что за зверь такой, как использовать? Гугл сказал иди на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
we2seek
78 / 78 / 17
Регистрация: 25.01.2010
Сообщений: 380
19.12.2016, 03:26     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации #13
<bean primary="true|false"/> не подойдет?
Yandex
Объявления
19.12.2016, 03:26     SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru