1

私の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参照を返す)

この問題の解決方法を提案できますか?私はここで何が欠けていますか?実行時に生成されるオブジェクトを永続化するための他のアイデアは参考になります。

おかげ..

答えて

0

あなたのリポジトリは、例えばcom.mypackage.repositoryのため、パッケージに住んでいます。あなたが目的(たとえば、@EnableTransactionManagementを、所有するため

@Configuration 
@ComponentScan(value = {"com.mypackage.controller"}) 
@EnableJpaRepositories(basePackages = {"com.mypackage.repository"}) 
public class MyConfig { 
    // creation and configuration of other beans 
} 

Configクラスは、より多くの注釈を有することができる@:春は、これらのBeanの意識になるように、あなたの設定では、(同様とコントローラとのパッケージ)このパッケージをスキャンする必要がありますテキストファイルのpropsのPropertySource)。私は注釈の義務的なセットを投稿します。

+0

ありがとうございます。私はここでSpringBootアノテーションを使用しています。 SpringBootは、SpringBootApplicationアノテーションに関連し、リポジトリでアノテーションされた任意の(サブ)パッケージにあるリポジトリを自動的に登録します。だから私は本当にEnableJpaRepositoriesを使用する必要はありません。しかし、私の問題は、コンパイル時に書いた既存のリポジトリと同じパッケージで実行時に自分のリポジトリを生成した場合、Springはそれをリポジトリとしてスキャンして認識することができません。 – mrgenco

関連する問題