Форум программистов, компьютерный форум, киберфорум
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. Показов 2274. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru