Java Spring—隐式地在类之间转换(寻找强制模式)
我希望在两组类(让我们称它们为Bean和模型)之间实施一种模式,这样它们就可以在彼此之间进行转换,而无需在每个Bean/Model PoJo(让我们称之为汇编器)中使用显式代码 我考虑为Bean、模型和汇编器创建基类,并从基类调用Assembler方法,这样每个Bean和模型都将隐式地获得convert方法 大概是这样的:Java Spring—隐式地在类之间转换(寻找强制模式),java,spring,Java,Spring,我希望在两组类(让我们称它们为Bean和模型)之间实施一种模式,这样它们就可以在彼此之间进行转换,而无需在每个Bean/Model PoJo(让我们称之为汇编器)中使用显式代码 我考虑为Bean、模型和汇编器创建基类,并从基类调用Assembler方法,这样每个Bean和模型都将隐式地获得convert方法 大概是这样的: BaseBean[BaseAssembler a, convertToModel(BaseBean b){a.convertToModel(b)}] BaseModel[Ba
BaseBean[BaseAssembler a, convertToModel(BaseBean b){a.convertToModel(b)}]
BaseModel[BaseAssembler a, convertToBean(BaseModel m){a.convertToBean(m)}]
BaseAssembler[convertToBean(BaseModel m), convertToModel(BaseBean b)]
class EmpBean extends BaseBean {
EmpAssembler a;
EmpBean(EmpAssembler a) {
this.a = a;
}
}
然后我将创建一组具体的类:
EmpBean[name,id] extends BaseBean
EmpModel[name,id] extends BaseModel
EmpAssembler[convertToBean(EmpModel m),convertToModel(EmpBean b)] implements BaseAssembler
现在,我想调用empBean.convertToModel()
并获取EmpModel
的一个实例。但实际上,我得到的只是assembler.convertToModel()
调用中的NPE
关于如何告诉Spring使用EmpBean
和EmpModel
而不是BaseAssembler
,您有什么想法吗
编辑:
我正在使用基于注释的配置,并尝试在不恢复到基于XML的配置的情况下解决此问题。如果我使用XML配置,我猜简单的解决方案是将具体类设置为汇编程序的值。如下所示:
<bean id="empAssembler" class="com.blah.EmpAssembler" />
<bean id="deptAssembler" class="com.blah.DeptAssembler" />
<bean id="empBean" class="com.blah.EmpBean" >
<property name="assembler" ref="empAssembler" />
</bean>
<bean id="empModel" class="com.blah.EmpModel" >
<property name="assembler" ref="empAssembler" />
</bean>
<bean id="bookBean" class="com.blah.BookBean" >
<property name="assembler" ref="bookAssembler" />
</bean>
<bean id="bookModel" class="com.blah.BookModel" >
<property name="assembler" ref="bookAssembler" />
</bean>
如何使用基于注释的配置实现这一点?我假设您希望调用
empBean.convertToModel()
,而不是empBean.getModel()
请在这里放一些具体的代码,说明EmpBean是如何从BaseBean继承的,以及它是如何初始化的。那么应该很容易看到
没有这些,我只能胡乱猜测:
NPE
提示您没有初始化BaseBean.aBaseBean[BaseAssembler a, convertToModel(BaseBean b){a.convertToModel(b)}]
BaseModel[BaseAssembler a, convertToBean(BaseModel m){a.convertToBean(m)}]
BaseAssembler[convertToBean(BaseModel m), convertToModel(BaseBean b)]
class EmpBean extends BaseBean {
EmpAssembler a;
EmpBean(EmpAssembler a) {
this.a = a;
}
}
然后是EmpBean.a“shadows”BaseBean.a,这意味着有两个a
的实例:
this.a
使用构造函数中的某个实例初始化,但是super.a
仍然是null
。而BaseBean.convertToModel(…)
只知道后者。
如果这是您的问题,那么您只需删除empa汇编程序代码>
回应你的评论:
如果构造函数注入不是一个选项,您可能希望尝试基于注释的setter注入。比如:
@Autowired
void setAssembler(EmpAssembler a) {
this.a = a;
}
使用Spring DI注入汇编器…?是的,我正在尝试这样做,但我不能在子类中这样做,因为我不希望每个Pojo都有汇编器的实例,我不能在基类中这样做,因为我如何注入实现类,超级类不知道哪个?也许你正在使用转换服务寻找什么?哦,这对我来说是新的。我将不得不对此进行调查,但看起来我需要一些东西。我知道你在说什么,有一段时间,阴影是导致这个问题的原因。因此,我从具体类中删除了assembler属性。但是我不想做构造函数注入,因为当@RequestBody转换为EmpModel类时,它可能会导致jackson出现问题。看看我用基于xml的配置对我的问题所做的更新。TBH,我只是想要一个解决方案,在不使用XML的情况下也能做到这一点。也许setter注入是适合您的方法。我在回答中附加了一些代码。