3

私のSpringBootアプリケーションでは、javapoetを使用して休止状態のエンティティクラスとリポジトリを生成し、実行時にOpenHFTライブラリを使用してこれらの生成されたソースファイルをそれぞれコンパイルしています。私の目的は、これらの実行時に生成されたエンティティを永続化できるようにすることです。

この生成されたエンティティを残りのコントローラー内で正常に使用し、@RequestBody json 文字列をこのエンティティにマップすることができました。しかし、私の問題は、ランタイムで生成されたリポジトリをコントローラーに挿入できなかったことです..

実行時に生成されたエンティティの例を次に示します。

@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> {

}

実行時にリポジトリを挿入できるように、私が使用している汎用リポジトリを次に示します。

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

}

以下は私の残りのコントローラーです。ここでは、汎用リポジトリをマップとして自動配線しているため、リポジトリ名をキーとして使用すると、Spring が正しいリポジトリ実装を動的に注入します。

genericRepo.get(レポ名).save(モデル);

@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") は null 参照を返しています)

この問題の解決策を提案していただけますか。ここで何が欠けていますか?実行時に生成されたオブジェクトを永続化するための他のアイデアは役に立ちます。

ありがとう..

4

2 に答える 2