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 ..
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