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

Java EE (J2EE)

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

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

10.12.2016, 09:00. Просмотров 416. Ответов 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);
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2016, 09:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос SpringBoot + xml конфигурация. Не работает автосвязывание по аннотации (Java EE):

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

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

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

Использование логирования в SpringBoot приложении - Java EE
Доброго времени суток. Во всех примерах, которые я находил в интернете, чтобы использовать логирование делают так, в классе создают...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
KEKCoGEN
Эксперт Java
1921 / 1799 / 436
Регистрация: 28.12.2010
Сообщений: 7,235
10.12.2016, 11:15 #2
Цитата Сообщение от dalay_lama Посмотреть сообщение
required a single bean, but 3 were found
русским по белому же. Нужен один а есть 3. Хз какой бин тащить. Такое поведение как вы хотите легко конфигурируется с помощью аннотации @Bean + @Configuration, либо @Conditional
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 470
10.12.2016, 13:03  [ТС] #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);
    }
}
0
Fene4ka_
91 / 91 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
12.12.2016, 01:01 #4
dalay_lama, есть еще несколько решений - не смешивать аннотации и xml, использовать Primary или Qualifier
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 470
12.12.2016, 13:30  [ТС] #5
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
не смешивать аннотации и xml
в рамках текущей задачи как раз было необходимо использовать аннотации и xml конфигурации - это удобно.
0
Fene4ka_
91 / 91 / 16
Регистрация: 24.01.2014
Сообщений: 1,215
12.12.2016, 14:03 #6
dalay_lama, чем же это удобно ? потом вылазит непонятная хрень и ты не понимаешь где и что искать, все, что вы пишите в xml можно заменить аннотациями, которые куда более удобно читаемые, тоже самое и с аннотациями, в случае необходимости, все можно заменить на xml, но смешивать это не рекомендуется
0
KEKCoGEN
Эксперт Java
1921 / 1799 / 436
Регистрация: 28.12.2010
Сообщений: 7,235
12.12.2016, 14:09 #7
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
тоже самое и с аннотациями, в случае необходимости, все можно заменить на xml
это не так. Есть вещи которые невозможно сделать через xml конфиг.
0
dalay_lama
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 470
12.12.2016, 14:23  [ТС] #8
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
чем же это удобно ?
не знаю как вам конечно, но мне удобнее создавать бины через xml конфигурации, т.к. при необходимости, я в любой момент могу заменить один бин на другой, без перекомпиляции приложения. если я всё буду создавать через аннотации, тогда всё жестко будет зашито в коде. Аннотации я использую в основном для автопривязывания.

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

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

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

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

Цитата Сообщение от dalay_lama Посмотреть сообщение
при создании бинов проверять входные параметры и выбирать реализацию через условные выражения?
можно так, а можно использовать аннотацию @Conditional. Она позволяет делать довольно интересные вещи. Например приносить реализацию бина в зависимости от наличия \ отсутствия какого либо другого бина и.т.д
1
we2seek
79 / 79 / 17
Регистрация: 25.01.2010
Сообщений: 385
19.12.2016, 03:26 #13
<bean primary="true|false"/> не подойдет?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2016, 03:26
Привет! Вот еще темы с ответами:

Динамическая или статическая конфигурация. Когда используется альтернативная 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){ ...

Аннотации в Java - Java
Объясните Пожалуйста, что на Java обозначает: &quot;@Override&quot; .

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.12.2016, 03:26
Ответ Создать тему
Опции темы

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