gpt4 book ai didi

java - @Entity 内的 @Autowired 无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 13:00:37 29 4
gpt4 key购买 nike

当我登录到我的应用程序时,我在 @Autowired 字段 hashProvider 处收到 NullPointerException。奇怪的是,这种情况只是偶尔发生!当我尝试 Debug模式时,该字段是自动连接的,当我正常运行它时,它不是。

@Configurable(preConstruction=true)
@Entity
@Table(name="DB_USER")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "USER_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class User extends AbstractEntity {

//...

@Autowired(required = true)
private transient HashProvider hashProvider;

//...

public boolean hasPassword(String password){
LOG.info("is null "+(hashProvider==null)); //sometimes is null sometimes not
return hashProvider.computeHash(password + salt).equals(this.password); //null pointer
}
}

@Component("hashProvider")
public class SHA1Provider implements HashProvider{
//...
@Override
public String computeHash(String s) {
//...
}
}

还记录不同用户是否引发异常。以 Doctor 身份登录时,该字段为空,以 AdminUser 身份登录时,该字段为非

@Entity
public class AdminUser extends User {

@Override
public String toString() {
return super.toString() + "AdminUser{" + '}';
}

@Override
public Boolean isAdmin() {
return true;
}
}

@Entity
@DiscriminatorValue("doctor")
public class Doctor extends User {

private String address;

@Column(length = 10, unique = true, name = "DOCTOR_BCN", nullable = false)
private Long birthNumber;

private Integer phone;

@OneToMany(mappedBy = "doctor")
@OrderBy("name ASC")
private List<Patient> patients;

//setters and getters

@Override
public String toString() {
return super.toString() + "Doctor{}";
}

@Override
public Boolean isAdmin() {
return false;
}
}

这是 applicationContext.xml 文件:

<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:mvc="http://www.springframework.org/schema/mvc"
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.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"
>
<!-- Use annotation to configure Spring context -->
<context:annotation-config />
<mvc:annotation-driven />
<!-- Search for beans under the com.wpa package (Using annotation @Component, @Repository, @Service) -->
<context:component-scan base-package="com.wpa"/>
<!-- @Configurable support -->
<context:spring-configured/>
<!-- Property files -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/properties/jdbc.properties</value>
<value>/WEB-INF/properties/jpa.properties</value>
</list>
</property>
</bean>
<!-- Connection pool -->
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- This defines the EntityManagerFactory bean, which provides the application with EntityManager instances = persistence context -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="databasePlatform" value="${jpa.platform}"/>
<property name="generateDdl" value="true"/>
<property name="showSql" value="true"/>
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="eclipselink.weaving" value="static"/>
<entry key="eclipselink.ddl-generation" value="create-or-extend-tables" />
</map>
</property>
<property name="packagesToScan" value="com.wpa"/>
<property name="jtaDataSource" ref="dataSource"/>
</bean>

<!-- Transaction manager for declarative transactional demarcation -->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- Use the declared transaction manager to manage transaction using the @Transactional annotation -->
<!-- proxy-target-class=true enables use of concrete classes without interfaces as beans with the @Transactional annotation -->
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="txManager"/>
</property>
</bean>
</beans>

最佳答案

@Autowire只能用在被spring标记的类上。例如@Service、@component、@Repostitory

编辑:我错过了 @Configurable,它也使它成为一个 spring ioc。

我知道的另一件事是,如果您在反序列化后在成员上写入 transient ,它将为空。这似乎与您的情况非常相似。这有道理吗?

编辑:Spring bean 不应该在 JPA 实体中使用。这是不好的做法。实现此目的的最佳实践是创建包含具有附加功能的 pojo 的包装器。我认为最好的办法是将逻辑保留在服务中,即使它是一个小逻辑..

关于java - @Entity 内的 @Autowired 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34980750/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com