英文:
Using BeanUtils.copyProperties from a Mybatis created object to a Spring Bean, the properties are null in the Spring bean. Why?
问题
问题出在我遇到的地方,我有一个类似这样的类
@Component
@RequestScope
public class TableModel{
private Integer tableField1;
...
//other properties, getters and setters here
}
Mybatis从映射到该对象的查询中返回结果,我希望将此对象的结果复制到另一个类中的Spring bean,就像这样:
public class MyClass {
TableModel model
@Autowired
MyClass(TableModel model) {
this.model = model;
//...
}
//some code
TableModel result = MyMapperInterface.selectFromTable();
//这里,result.tableField1不是0或null
BeanUtils.copyProperties(result, model);
//在copyProperties()之后,model.tableField1仍然为null
//...
}
然而,在BeanUtils.copyProperties()调用之后,model中的属性仍然为null。我仔细检查过,我**没有**使用Apache Commons版本的copyProperties,我正在使用Spring版本的BeanUtils。问题是什么?
英文:
The problem I am encountering is that I have a class that looks something like this
@Component
@RequestScope
public class TableModel{
private Integer tableField1;
...
//other properties, getters and setters here
}
Mybatis returns results from queries mapped to this object, and I wish to copy the result from this object to my Spring bean in a different class, like so:
public class MyClass {
TableModel model
@Autowired
MyClass(TableModel model) {
this.model = model;
//...
}
//some code
TableModel result = MyMapperInterface.selectFromTable();
//Here, result.tableField1 is not 0 or null
BeanUtils.copyProperties(result, model);
//After copyProperties(), model.tableField1 is still null
//...
}
However, after the BeanUtils.copyProperties()
call, the properties in model
are still null. I double checked, and I am not using the Apache Commons version of copyProperties, I am using the Spring version of BeanUtils. What is the issue?
答案1
得分: 1
@RequestScope
表示每个请求都会获得一个不同的实例。从语义上讲,这与将其作为构造函数参数传递(这意味着它在该 bean 的所有用户之间是共享的)不符。
即便如此,Spring 会尝试通过为你的 TableModel
注入一个 代理 来使其在请求上下文中根据需要进行切换。可能正在发生的情况是,底层实例并不相同。
通常要避免使用请求范围的 bean。不要为每个请求的数据使用注入;而是应该使用方法参数。(我建议使用 MapStruct 而不是 BeanUtils,因为它既更快,又更安全。)
英文:
@RequestScope
means that you get a different instance for every request. Semantically, this does not match with passing it as a constructor parameter (meaning it's shared for all users of that bean).
Even so, Spring will try to make that work for you by injecting a proxy for your TableModel
that will magically switch it around depending on the request context. What's probably happening is that your underlying instance is not the same.
Avoid request-scoped beans generally. Don't use injection for per-request data; use method parameters instead. (And I suggest using MapStruct instead of BeanUtils, as it's both faster and safer.)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论