1

In meiner SpringBoot-Anwendung erzeuge ich Hibernate-Entity-Klassen und Repositorys mit javapoet und dann kompilieren diese generierten Quelldateien jeweils mit OpenHFT Bibliothek zur Laufzeit. Mein Zweck ist es, in der Lage zu sein, diese Laufzeit-generierten Entitäten persistent zu machen.Runtime generierte Repositorys und Entitäten

Ich konnte diese generierte Entität erfolgreich in meinem Rest-Controller verwenden und @RequestBody json String dieser Entität zuordnen. Aber mein Problem ist, konnte ich meine Laufzeit generierte Repository nicht in den Controller injizieren ..

Hier ist ein Beispiel Laufzeit generierte Einheit;

@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; 
    } 

Hier ist die erzeugte Runtime-Repository für obige Entität

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

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

} 

Hier ist der generische Repository ich so bin mit, dass ich

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

} 

meine repos zur Laufzeit injizieren kann und unten ist meine Ruhesteuerung. Hier wird das generische Repository automatisch als Map gespeichert, sodass Spring die korrekte Repository-Implementierung dynamisch einfügt, wenn ich es mit dem Repository-Namen als Schlüssel verwende;

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

@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); 
    } 
} 

Dies funktioniert für Repositorys, die ich manuell geschrieben und ich kann dynamisch Objekte mit diesem Ansatz persistierenden. Aber ich konnte nicht auf meine Laufzeit-generierten Repositories zugreifen. (genericRepo.get ("authorRepository") gibt Nullreferenz zurück)

Können Sie eine Lösung für dieses Problem vorschlagen. Was fehlt mir hier? Jede andere Idee für das dauerhafte Erstellen von Objekten wäre hilfreich.

Dank ..

Antwort

0

Ihre Repositories leben in einem Paket, zum Beispiel com.mypackage.repository. In der Config sollten Sie dieses Paket scannen (und das Paket mit den Controllern als auch), so dass Frühling kennt diese Bohnen wird:

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

Config Klasse kann mehr Anmerkungen haben für Sie Zwecke besitzen (etwa @EnableTransactionManagement, @ PropertySource für Requisiten in Textdateien). Ich poste nur den obligatorischen Satz von Anmerkungen.

+0

Danke but..Ich verwende nur SpringBoot Annotation hier. Spring Boot registriert automatisch jedes Repository, das in einem (Unter-) Paket relativ zur SpringBootApplication-Annotation gefunden und mit Repository versehen ist. Also brauche ich nicht wirklich EnableJpaRepositories zu verwenden. Mein Problem ist jedoch, wenn ich meine Repositories zur Laufzeit im selben Paket mit vorhandenen Repositories (die ich vor der Kompilierung geschrieben habe) generieren kann Spring nicht scannen und erkennen es als ein Repository. – mrgenco

Verwandte Themen