Ошибки XML контекста приложения Spring Tool Suite, несмотря на то, что все компоненты, похоже, работают так, как должны

#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. Я выставлю заявку и поиграю с ней, но что касается этой темы, я считаю, что на мой вопрос дан ответ. Спасибо.