我有一个小应用程序是RabbitMQ和SQL数据库之间的桥梁。它意味着从队列中消耗(少数类型的)事件并将它们存储在DB中的适当表中。在大多数情况下,事件和实体之间几乎没有处理(只是字段复制)。这就是为什么我注入了一个Dozer映射器进行转换的原因 - 它可以完美地工作。困难的部分是将通用对象保存到存储库,而不必使用switch
+ instanceof
作为最后的手段。
代码:
@Service
public class EventProcessorImpl implements EventProcessor {
@Autowired
private Mapper mapper; // a Dozer mapper instance
@Override
public void process(final BaseEvent event) {
final BaseEntity entity = mapper.map(event, BaseEntity.class);
// TODO save the entity to the database after it's transformed
}
}
BaseEntity
是entites的基类,如下所示:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
@Id
private String guid;
public String getGuid() {
return guid;
}
public void setGuid(final String guid) {
this.guid = guid;
}
}
@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity>
extends CrudRepository<T, String> {
}
@Repository
public interface EmailOpenedRepository
extends BaseRepository<EmailOpened> {
}
问题是 - 如何保存实体,因为:
我尝试过:
@Autowired
BaseRepository
的实例并尝试调用repository.save(entity)
,但由于有多个bean定义,它在应用启动时失败。根据question,我已成功实施以下内容,但我不知道这是否是正确的方法:
public void process(final BaseEvent event) {
final BaseEntity entity = mapper.map(event, BaseEntity.class);
final CrudRepository repository = (CrudRepository) new Repositories(context)
.getRepositoryFor(entity.getClass());
repository.save(entity);
}
我想过迭代BaseRepository
的所有可用bean并找到支持这种类型的bean findFirst(repository -> repository.supports(entity.getType()))
,但Spring Data JPA存储库是接口,我无法存储支持的类型在界面中。