私のSpringBootアプリケーションでは、javapoetを使用してhibernateエンティティクラスとリポジトリを生成し、実行時にそれぞれOpenHFTライブラリを使用してこれらの生成されたソースファイルをコンパイルします。私の目的は、これらの実行時生成エンティティを永続化できることです。実行時に生成されたリポジトリとエンティティ
私はこの正常に生成されたエンティティをレストコントローラ内で使用し、このエンティティに@RequestBody json Stringをマップできました。 しかし、私の問題は、コントローラに私の実行時に生成されたリポジトリを注入できないことです。
ここには実行時生成エンティティの例があります。ここで
@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;
}
私はランタイム
@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable > extends PagingAndSortingRepository<T, ID>{
}
以下で私のレポを注入できるように、上記のエンティティの実行時に生成リポジトリ
import org.springframework.stereotype.Repository;
import java.lang.Long;
import com.mrg.domain.Author;
@Repository("authorRepository")
public interface AuthorRepository extends GenericRepository<Author, Long> {
}
ここでは、私が使用している一般的なリポジトリです私の残りのコントローラです。ここでは、汎用リポジトリをMapとしてオートワイヤリングして、リポジトリ名をキーとして使用するときにSpringが正しいリポジトリ実装を動的に注入するようにします。
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")がnull参照を返す)
この問題の解決方法を提案できますか?私はここで何が欠けていますか?実行時に生成されるオブジェクトを永続化するための他のアイデアは参考になります。
おかげ..
ありがとうございます。私はここでSpringBootアノテーションを使用しています。 SpringBootは、SpringBootApplicationアノテーションに関連し、リポジトリでアノテーションされた任意の(サブ)パッケージにあるリポジトリを自動的に登録します。だから私は本当にEnableJpaRepositoriesを使用する必要はありません。しかし、私の問題は、コンパイル時に書いた既存のリポジトリと同じパッケージで実行時に自分のリポジトリを生成した場合、Springはそれをリポジトリとしてスキャンして認識することができません。 – mrgenco