【发布时间】:2026-01-20 18:15:02
【问题描述】:
我有一个名为 Menu 的类,注释为 @Entity 我需要在一个名为 GestoreMessaggi 的类中使用方法
....
@Component
@Entity
@Table(name="menu")
public class Menu implements Serializable{
@Autowired
@Transient // because i dont' save this field on the DB
private GestoreMessaggi gestoreMessaggi;
.....
public void setCurrentLanguage(){
/* I got the error both if use gestoreMessaggi
this way and if I use the autowired istance of GestoreMessaggi*/
GestoreMessaggi gestoreMessaggi = new GestoreMessaggi();
gestoreMessaggi.gest();
}
.....
这是GestoreMessaggi类的相关代码
@Component
public class GestoreMessaggi {
@Autowired
private ReloadableResourceBundleMessageSource messageSource;
public void gest(){
messageSource.doSomething() <--- here messageSource is null
}
}
什么时候,我调用 gestoreMessaggi.gest();从 Menu 类中,我收到一个错误,因为 messageSource 为空。 gestoreMessaggi istance 不为空,为空只是 messageSource
重要提示:只有当我从注释为 @Entity 的类中调用 GestoreMessaggi 时,我才会在 messageSource 上得到 null。
在 ds-servlet.xml 中,我告诉 Spring 扫描包含 Menu 和 GestoreMessaggi 类的包:
//Menu package
<context:component-scan base-package="com.springgestioneerrori.model"/>
//Gestore messaggi package
<context:component-scan base-package="com.springgestioneerrori.internazionalizzazione"/>
谢谢
【问题讨论】:
-
请包括您的弹簧配置。您确定
Menu类是由 Spring 管理的吗? -
Spring 只会将依赖注入到它自己管理的对象中。
@Entity注解的类不由 spring 管理(不管@Component注解)。 -
最好在构造函数上使用
@Autowired并设置字段final。如果你这样做,那么你肯定会明白为什么messageSource为空。 -
我应该怎么做才能告诉 Spring '管理'我的对象?
-
恕我直言,您甚至不应该尝试解决此依赖问题。您将太多逻辑放入您的实体中,最好应该是一个简单的 POJO。确定语言(或翻译或您在那里所做的任何事情)不应该在您的实体内部完成;该值应赋予您的实体(例如,通过您的服务、业务对象......)。
标签: java spring spring-mvc