#java #xml #spring
#java #xml #spring
Вопрос:
Я настраиваю репозитории jpa и jpa внутри одного из XML-файлов контекста приложения Spring.
Если у меня есть оба, <jpa:repositories base-package="..." />
и <context:component-scan base-package="..." />
тогда Spring Tool Suite показывает ошибку в строке 1, говоря
Referenced file contains errors (http://www.springframework.org/schema/context/spring-context-4.0.xsd). For more information, right click on the message in
the Problems View and select "Show Details..."
и при нажатии показать детали я получаю это:
The errors below were detected when validating the file "spring-context-4.0.xsd" viathe file "app-config.xml". In most cases these errors can be detected by validating "spring-context-4.0.xsd" directly. However it is possible that errors will only occur when spring-context-4.0.xsd is validated in the context of app-config.xml.
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,propertyPlaceholder'. line 22
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,property-placeholder'. line 91
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,property-override'. line 155
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,annotation.config'. line 174
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,component-scan'. line 194
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,load-time-weaver'. line 315
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,spring-configured'. line 392
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,mbean-export'. line 405
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,mbean-server'. line 458
sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of 'http://www.springframework.org/schema/context,filterType'. line 488
И рядом <jpa:repositories base-package="..." />
есть предупреждение о том, что Referenced bean 'jpaMapppingContext' not found
Запуск приложения, похоже, работает правильно. Я могу подключиться к БД и, используя интерфейс JpaRepository, я могу извлекать данные из БД, поэтому я не уверен, почему я столкнулся с фатальной ошибкой в STS. Я предполагаю, что, поскольку оба jpa: репозитории и context: component-scan сканируют пакеты, при использовании обоих происходит некоторое дублирование / конфликты, но я не уверен, как мне следует подойти к его исправлению (я, вероятно, мог бы разделить сервисы на их собственный конфигурационный xml и либо импортировать его в app config, либо добавить в context list в web.xml )
Вот app-config.xml в целом:
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:context="http://www.springframework.org/schema/context"
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-4.0.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="org.h2.Driver"
p:url="jdbc:h2:tcp://localhost/~/test;INIT=CREATE SCHEMA IF NOT EXISTS TEST"
p:username="sa"
p:password="" />
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:showSql="true" />
<util:map id="jpaProperties">
<entry key="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<entry key="hibernate.hbm2ddl.auto" value="update" />
<entry key="hibernate.default_schema" value="test" />
</util:map>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"
p:packagesToScan="hr.mrplow.test.model"
p:jpaVendorAdapter-ref="jpaVendorAdapter"
p:jpaProperties-ref="jpaProperties" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"
p:rollbackOnCommitFailure="true" />
<tx:annotation-driven transaction-manager="transactionManager" />
<jpa:repositories base-package="hr.mrplow.test.DAO" />
<!-- Services -->
<context:component-scan base-package="hr.mrplow.test.service" />
</beans>
Вот полный app-config.xml
Комментарии:
1. Я полагаю, что вы включаете один и тот же компонент дважды. Можете ли вы убедиться, что включаете их максимум один раз?
2. Хм, ну, я выполняю сканирование пакетов в двух разных пакетах, и ни в одном из них нет повторяющихся классов. В пакете DAO у меня есть интерфейс JpaRepository, а в пакете service у меня есть интерфейс service и реализация, в которой автоматически подключен dao.
3. Сообщение указывает на ошибку в
spring-context-4.0.xsd
, а номера повторяющихся строк увеличиваются до 488, что намного превышает длину вашего файла. Какую версию spring-framework и spring-jpa вы используете именно?4. @SergeBallesta 4.0.5.RELEASE для обоих.
Ответ №1:
Это известная проблема в STS:
https://jira.spring.io/browse/DATAJPA-160
Хотя утверждалось, что эта проблема закрыта, вы можете видеть на этом форуме, что она все еще всплывает.
Вам следует рассмотреть возможность открытия билета jira с помощью Spring в вашем случае.
Комментарии:
1. Итак, на данный момент я должен игнорировать ошибки? Могу ли я считать их безвредными? Приложение работает, но я обычно не доволен наличием ошибок в моих приложениях. В настоящее время мой «обходной путь» заключается в разделении репозитория и сканеров пакетов услуг на два XML-файла и импорте их в мой app-config.xml . Это избавляет от ошибок
2. @MrPlow Я знаю, что раздражает видеть красный флаг, скрывающийся за углом. Но пока приложение работает, все должно быть в порядке. Вы можете попробовать еще одну вещь, чтобы удалить версию xsd, подобную springframework.org/schema/data/jpa/spring-jpa.xsd и посмотрите.
3. Я выставлю заявку и поиграю с ней, но что касается этой темы, я считаю, что на мой вопрос дан ответ. Спасибо.