gpt4 book ai didi

spring - 运行时生成的存储库和实体

转载 作者:行者123 更新时间:2023-12-04 17:48:32 25 4
gpt4 key购买 nike

在我的 SpringBoot 应用程序中,我使用 javapoet 生成休眠实体类和存储库然后使用 OpenHFT 分别编译这些生成的源文件库在运行时。我的目的是能够保留这些运行时生成的实体。

我可以在我的 rest Controller 中成功使用这个生成的实体并将 @RequestBody json String 映射到这个实体。 但我的问题是我无法将运行时生成的存储库注入(inject) Controller ..

这是一个运行时生成的实体示例;

@Entity
public class Author extends BaseEntity{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;

public Author(){
super();
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

这是为上述实体生成的运行时存储库

import org.springframework.stereotype.Repository;
import java.lang.Long;
import com.mrg.domain.Author;

@Repository("authorRepository")
public interface AuthorRepository extends GenericRepository<Author, Long> {

}

这是我正在使用的通用存储库,这样我就可以在运行时注入(inject)我的存储库

@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable > extends PagingAndSortingRepository<T, ID>{

}

下面是我的休息 Controller 。在这里,我将通用存储库 Autowiring 为 Map,以便当我将存储库名称作为键使用它时,Spring 会动态注入(inject)正确的存储库实现;

genericRepo.get(repoName).save(model);

@RestController
@RequestMapping("/{entity}")
public class GenericRestController {


@Autowired
private Map<String, GenericRepository> genericRepo;

@RequestMapping(value = "/{entity}/", method = RequestMethod.POST)
public @ResponseBody Object createEntity(@PathVariable String entity, @RequestBody String requestBody) {

Object model = null;
ObjectMapper mapper = new ObjectMapper();
String repoName = "";

try {

// ex : if {entitiy} param is equal "author" modelName will be "Post"
String modelName = Character.toUpperCase(entity.charAt(0)) + entity.substring(1);

Class<?> clazz = Class.forName("com.mrg.domain." + modelName);
model = clazz.newInstance();

// Converting @RequestBody json String to domain object..
model = mapper.readValue(requestBody, clazz);

// Repository name is {entity} + "Repository" ex : authorRepository
repoName = entity.concat("Repository");

} catch (Exception ex) {

// handling exceptions..
}
// Saving with right repository
return genericRepo.get(repoName).save(model);
}
}

这适用于我手动编写的存储库,我可以使用这种方法动态地持久化对象。但是我无法访问我的运行时生成的存储库。(genericRepo.get(“authorRepository”)返回空引用)

你能为这个问题提出一个解决方案吗?我在这里错过了什么?任何其他持久化运行时生成的对象的想法都会有所帮助。

谢谢..

最佳答案

最近,我遇到了类似的情况,必须在运行时生成存储库以减少样板代码。通过一些研究,事实证明,当扫描使用@Repository 注释的接口(interface)时,它使用的是 ClassPathScanningCandidateComponentProvider,它扫描类路径中的类,忽略运行时生成的类。

关于spring - 运行时生成的存储库和实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46999573/

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