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

标签 spring spring-boot dependency-injection spring-data-jpa javapoet

在我的 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/

相关文章:

php - 依赖注入(inject)还是范围解析运算符?

ios - Swinject 的循环依赖问题

Spring Boot EnvironmentPostProcessor 重写命令行

java - 在 Spring MVC 中创建的模型对象到底在哪里?

java - Spring boot、hibernate、hikariCP 和 mysql 不活动后无通信

java - 我的应用程序在资源文件夹中有 application.yml 但是 Spring boot 应用程序提示找不到 application.properties

java - 如何在 Spring Boot 应用程序上注册 javax.jws.Webservice

java - spring data动态组合@query查询

java - 为什么 HibernateTemplate 中的 findXXX() 方法返回非参数化列表?

android - dagger 中的 DI 和泛型类