为了Inject
没有公共接口的超类的所有子类,我创建了一个与所述超类紧密耦合的接口,每个“正确”编写的子类都应实现。
这有效,但似乎很疯狂。有更好的方法吗?
简单的强制转换不起作用,因为Instance
仅包含一个代理,该代理在被调用时不解析为接口的任何实际子类。这样就产生了ClassCastException
。
我最近受命为应用程序提供框架代码。在此应用程序中,几个数据传输对象正在和服务级别POJO之间进行映射,但是它们的映射并不总是那么简单。推土机用于完成大部分工作并避免样板代码。
在需要显式映射指令的特定情况下,Dozer当前的建议是使用API驱动的映射。初始化后,所有定义映射的BeanMappingBuilder
子类都应添加到Dozer映射器中。
为了将添加新BeanMappingBuilder
所需的所有工作都放在一个地方,我进行了复杂的依赖注入,尽管没有通用接口,但依赖注入会自动将其添加到Dozer映射器中,只是与其他人共同的超类。
界面:
@Local
public interface DtoBeanMappingBuilder {
BeanMappingBuilder get();
}
子类示例:
@Stateless
public class SomeDtoMappingBuilder extends BeanMappingBuilder implements DtoBeanMappingBuilder {
@Override
public BeanMappingBuilder get() {
return this;
}
@Override
protected void configure() {
mapping(
// Some mapping...
);
}
}
具有注入点的映射器:
@Singleton
@Startup
public class DtoBeanMapper {
private DozerBeanMapper innerMapper;
@Inject
@Any
private Instance<DtoBeanMappingBuilder> mappingBuilders;
public <D> D map(Object source, Class<D> destinationClass) {
return innerMapper.map(source, destinationClass);
}
@PostConstruct
private void init() {
innerMapper = new DozerBeanMapper();
mappingBuilders.forEach(mb -> innerMapper.addMapping(mb.get()));
}
}