gpt4 book ai didi

java - 对 Spring 非托管 bean 的依赖注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:26 27 4
gpt4 key购买 nike

我有一个非托管的 JPA 域类。它通过 new 运算符实例化。

UserAccount account = new UserAccount();
userRepository.save(account)

在我的 UserAccount 类中,我有一个 beforeSave() 方法,它依赖于我的 SecurityService 对密码进行哈希编码。

我的问题是“如何让 spring DI 将安全服务注入(inject)我的实体?”。似乎 AspectJ 和 LoadTimeWeaving 是我所需要的。我已经尝试了一个配置数组,但我似乎无法让它们中的任何一个工作。尝试在注入(inject)的对象上调用方法时,我总是得到一个 NullPointerException

UserAccount.java(这是 JPA 实体)

@Entity
@Repository
@Configurable(autowire = Autowire.BY_TYPE)
public class UserAccount implements Serializable {

@Transient
@Autowired
SecurityService securityService;

private String passwordHash;

@Transient
private String password;

public UserAccount() {
super();
}

@PrePersist
public void beforeSave() {
if (password != null) {
// NullPointerException Here!!!
passwordHash = securityService.hashPassword(password);
}
}
}

试图指示 spring 使用 AspectJ:

NitroApp.java(主类)

@SpringBootApplication
@EnableTransactionManagement
@EnableSpringConfigured
@PropertySources(value = {@PropertySource("classpath:application.properties")})
public class NitroApp extends SpringBootServletInitializer {


public static void main (String[] args) {
SpringApplication.run(NitroApp.class);
}

}

build.gradle(配置)

buildscript {
repositories {
mavenCentral()
jcenter()
}

dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.2.2.RELEASE"
classpath "org.springframework:springloaded:1.2.2.RELEASE"
classpath "org.springframework:spring-aspects:4.1.6.RELEASE"
}
}

apply plugin: 'java'
apply plugin: 'aspectj'
apply plugin: 'application'
apply plugin: 'idea'
apply plugin: 'spring-boot'

repositories {
jcenter()
mavenLocal()
mavenCentral()
}

mainClassName = 'com.noxgroup.nitro.NitroApp'
applicationName = "Nitro"

idea {
module {
inheritOutputDirs = false
outputDir = file("$buildDir/classes/main/")
}
}

dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-actuator")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("net.sourceforge.nekohtml:nekohtml:1.9.15")
compile("commons-codec:commons-codec:1.9")
compile("org.postgresql:postgresql:9.4-1201-jdbc41")
}

task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}

最佳答案

您可以在用于实例化 UserAccount 的类中注入(inject) Spring applicationContext。

@Autowired
private ApplicationContext applicationContext;

然后,以这种方式创建您的 UserAccount bean:

UserAccount userAccount = applicationContext.getBean(UserAccount.class);

这样,您可以在 UserAccount 类中注入(inject)所需的依赖项。

关于java - 对 Spring 非托管 bean 的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30890380/

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