gpt4 book ai didi

java - Spring - 在类之间隐式转换(寻求强制执行模式)

转载 作者:行者123 更新时间:2023-12-01 23:30:14 24 4
gpt4 key购买 nike

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

我想到为 Beans、Models 和 Assemblers 创建基类,并从基类调用 assemblers 方法,这样每个 Bean 和 Model 都会隐式地获得转换方法。

类似这样的事情:

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)]

然后我将创建一组具体的类:

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 EmpBeanEmpModel 使用 EmpAssembler 而不是 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以及如何初始化的。那么应该很容易看到。

如果没有这个,我只能大胆猜测:

  1. NPE 提示您错过了初始化 BaseBean.a
  2. 如果 EmpBean 有自己的 EmpBean.a,另一个原因可能是“影子”:

如果您的 EmpBean 类如下所示:

class EmpBean extends BaseBean {
EmpAssembler a;
EmpBean(EmpAssembler a) {
this.a = a;
}
}

然后 EmpBean.a “影子”BaseBean.a,这意味着有两个 a 实例:this.a 使用构造函数中的某个实例进行初始化,但 super.a 仍然是 null。而 BaseBean.convertToModel(...) 只知道后者。如果这是您的问题,那么您只需删除 EmpAssembler a;

回复您的评论:如果构造函数注入(inject)不可行,您可能需要尝试基于注释的 setter 注入(inject)。像这样的东西:

@Autowired
void setAssembler(EmpAssembler a) {
this.a = a;
}

关于java - Spring - 在类之间隐式转换(寻求强制执行模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58292624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com