Я делаю проект GWTP и использую Spring Data JPA для подключения к базе данных оракула. Я прочитал несколько руководств, в которых интерфейс репозитория используется напрямую без использования реализации. Это было @Autowired там, где это было необходимо, и это работало нормально. Я попытался использовать ту же стратегию, но кажется, что @Autowired аннотация не работает вообще.@Autowired не вводит Spring Data JPA Repository - NullPointerException
Вот мой Repository:
@Repository
public interface BugRepository extends JpaRepository<Bug, Long> {
List<Bug> findAll();
.....
}
Я пытаюсь внедрить его с @Autowired в моей реализации услуг (я использую RESTful услуги):
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/bugs")
@Component
public class BugServiceImpl{
@Autowired
private BugRepository bugRepository;
@GET
@Path("/findAll")
public List<Bug> findAll() {
return bugRepository.findAll();
}
}
Вот мой Entity:
@Entity
@Table(name = "BUGS")
@SequenceGenerator(name = "BUG_SEQUENCE", sequenceName = "BUG_SEQUENCE")
public class Bug implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BUG_SEQUENCE")
@Column(name="BUG_ID")
private Long bugId;
@Column(name="BUG_NAME")
private String bugName;
@OneToOne
@PrimaryKeyJoinColumn
@Column(name="CREATED_BY")
private User createdBy;
@OneToOne
@PrimaryKeyJoinColumn
@Column(name="ASSIGNED_TO")
private User assignedTo;
@Column(name="CREATION_DATE")
private Date creationDate;
@Column(name="LAST_UPDATE_DATE")
private Date lastUpdateDate;
@Column(name="BUG_COMMENT")
private String bugComment;
@OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.EAGER, orphanRemoval = true)
@PrimaryKeyJoinColumn
@Column(name="PRIORITY_ID")
private Priority priority;
@OneToOne
@PrimaryKeyJoinColumn
private Status status;
public Bug() {
}
}
У меня также есть applicationContext.xml и persistence.xml в основном/ресурсы/META-INF. Вот мой applicationContext.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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<context:component-scan base-package="com.edu" />
<jpa:repositories base-package="com.edu.server.repositories" />
<context:annotation-config />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="***"/>
<property name="username" value="***"/>
<property name="password" value="***"/>
</bean>
<!-- EntityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:packagesToScan="com.edu.shared.entity"
p:dataSource-ref="dataSource"
>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="false" />
</bean>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
Мой persistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<!-- oracle -->
<persistence-unit name="oracle">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.edu.server.service.BugServiceImpl</class>
<class>com.edu.server.repositories.BugRepository</class>
<class>com.edu.shared.entity.Bug</class>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" />
<property name="hibernate.connection.url" value="***" />
<property name="hibernate.connection.username" value="***" />
<property name="hibernate.connection.password" value="***" />
<property name="hibernate.flushMode" value="FLUSH_AUTO" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
И, наконец, исключение, которое я получаю:
java.lang.NullPointerException
com.edu.server.service.BugServiceImpl.findAll(BugServiceImpl.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
...
Когда Я отлаживаю e и помещает точку останова в автообновленный репозиторий, он кажется нулевым, поэтому я полагаю, что он не был введен правильно, и поэтому при вызове метода findAll запускается исключение NullPointerException. Итак, почему вы думаете, что @Autowired аннотация не работает?
Пакет всех классов (аннотированные классы с Component, Service, Repository) начинается с com.edu? – Unknown
Becuase это не управляемый весом компонент, но управляемый Джерси, поэтому '@ Autowired' ничего не делает. Поле '@ Autowired' не может быть« null », если зависимость не может быть выполнена, приложение будет разбиваться при запуске (оно не запустится), а не во время выполнения. Когда это «нуль», вы сами создаете экземпляры классов (например, «новый BugServiceImpl»), или yu используют его за пределами Spring (это то, что вы делаете). Настройка Джерси и весна, чтобы правильно интегрироваться, как это сделать, ясно объяснено в справочнике по джерси. –
В вашем persistance.xml у вас должны быть только сущности beans (например, Bug), но не Сервисы или Repos (у вас есть ваш репо там, где есть ваш ServiceImpl) – Mechkov