Java Spring—隐式地在类之间转换(寻找强制模式)

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

我希望在两组类(让我们称它们为Bean和模型)之间实施一种模式,这样它们就可以在彼此之间进行转换,而无需在每个Bean/Model PoJo(让我们称之为汇编器)中使用显式代码

我考虑为Bean、模型和汇编器创建基类,并从基类调用Assembler方法,这样每个Bean和模型都将隐式地获得convert方法

大概是这样的:

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.a
  • 如果EmpBean有自己的EmpBean,另一个原因可能是“隐藏”。a:
  • 如果您的类EmpBean如下所示:

    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.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注入是适合您的方法。我在回答中附加了一些代码。