Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495

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

10.12.2016, 09:00. Показов 2315. Ответов 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;
    /**......*/
}
А ругается он вот так -
Code
1
2
3
4
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);
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2016, 09:00
Ответы с готовыми решениями:

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

Не работает SpringBoot
Добрый день! Установил идею и создал проект спринга. Идея подчеркивает аннотации спринга красным и не видит вообще этот пакет. Что делать? ...

SpringBoot - WebSocket не работает @Autowired
всем привет. не пойму в чем дело, гугление особо ниче не дает. проект на спрингбуте, часть, где используются вебсокеты, не видит бинов. ...

12
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.12.2016, 11:15
Цитата Сообщение от dalay_lama Посмотреть сообщение
required a single bean, but 3 were found
русским по белому же. Нужен один а есть 3. Хз какой бин тащить. Такое поведение как вы хотите легко конфигурируется с помощью аннотации @Bean + @Configuration, либо @Conditional
0
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
10.12.2016, 13:03  [ТС]
Цитата Сообщение от 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);
    }
}
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
12.12.2016, 01:01
dalay_lama, есть еще несколько решений - не смешивать аннотации и xml, использовать Primary или Qualifier
0
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
12.12.2016, 13:30  [ТС]
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
не смешивать аннотации и xml
в рамках текущей задачи как раз было необходимо использовать аннотации и xml конфигурации - это удобно.
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
12.12.2016, 14:03
dalay_lama, чем же это удобно ? потом вылазит непонятная хрень и ты не понимаешь где и что искать, все, что вы пишите в xml можно заменить аннотациями, которые куда более удобно читаемые, тоже самое и с аннотациями, в случае необходимости, все можно заменить на xml, но смешивать это не рекомендуется
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
12.12.2016, 14:09
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
тоже самое и с аннотациями, в случае необходимости, все можно заменить на xml
это не так. Есть вещи которые невозможно сделать через xml конфиг.
0
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
12.12.2016, 14:23  [ТС]
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
чем же это удобно ?
не знаю как вам конечно, но мне удобнее создавать бины через xml конфигурации, т.к. при необходимости, я в любой момент могу заменить один бин на другой, без перекомпиляции приложения. если я всё буду создавать через аннотации, тогда всё жестко будет зашито в коде. Аннотации я использую в основном для автопривязывания.

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

Цитата Сообщение от Fene4ka_ Посмотреть сообщение
что вы пишите в xml можно заменить аннотациями, которые куда более удобно читаемые
это довольно субъективное утверждение.
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
12.12.2016, 14:50
Цитата Сообщение от dalay_lama Посмотреть сообщение
Ну, если не понимаешь, что делаешь, то да, будет не понятно.
привычка писать код только для себя - плохая привычка, иначе бы не придумали ооп.
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Есть вещи которые невозможно сделать через xml конфиг.
можно привести пример для общего развития ?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
12.12.2016, 15:25
Цитата Сообщение от dalay_lama Посмотреть сообщение
если я всё буду создавать через аннотации, тогда всё жестко будет зашито в коде.
это если вы будите делать кривую конфигурацию. При правильном конфиге при желании можно даже без перезагрузки сервера обойтись

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

Добавлено через 26 минут
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
это если вы будите делать кривую конфигурацию.
через аннотации у меня объявлены 2 бина реализации одного итерфейса. Через Qualifier я указал, какой конкретно бин мне нужен, скомпилировал приложение. в какой-то прекрасный момент я решил, что хочу использовать другой бин? как мне это сделать без перекомпиляции? при создании бинов проверять входные параметры и выбирать реализацию через условные выражения?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
12.12.2016, 17:41
Цитата Сообщение от dalay_lama Посмотреть сообщение
Через Qualifier я указал, какой конкретно бин мне нужен
в этом и проблема

Цитата Сообщение от dalay_lama Посмотреть сообщение
при создании бинов проверять входные параметры и выбирать реализацию через условные выражения?
можно так, а можно использовать аннотацию @Conditional. Она позволяет делать довольно интересные вещи. Например приносить реализацию бина в зависимости от наличия \ отсутствия какого либо другого бина и.т.д
1
 Аватар для we2seek
84 / 84 / 42
Регистрация: 25.01.2010
Сообщений: 386
19.12.2016, 03:26
<bean primary="true|false"/> не подойдет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2016, 03:26
Помогаю со студенческими работами здесь

SpringBoot+thymeleaf не работает встраивание (вложение) страниц
addUser.html &lt;!DOCTYPE html&gt; &lt;html xmlns:th=&quot;http://www.thymeleaf.org&quot; lang=&quot;ru&quot;&gt; &lt;head&gt; &lt;title&gt;CRUDSpringBoot&lt;/title&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru