自动装配不适用于Class @Entity
我有一个叫做 的类,标注为 ,在这里我需要在一个名为 的类中使用一个方法
.... @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类,因为 为null *
:仅当我从标注为 类中调用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"/>
谢谢
回答:
您可以采用两种方法:
- 尝试从
@Entity
类的方法中获取Spring管理的Bean的实例 - 按照@Stijn Geukens的建议更改设计,并使您的实体成为POJO,而没有任何逻辑或依赖项注入机制
如果通过选项1,则必须显式访问Spring的上下文并检索所需的bean实例:
@Componentpublic class Spring implements ApplicationContextAware {
private static final String ERR_MSG = "Spring utility class not initialized";
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T bean(Class<T> clazz) {
if (context == null) {
throw new IllegalStateException(ERR_MSG);
}
return context.getBean(clazz);
}
public static <T> T bean(String name) {
if (context == null) {
throw new IllegalStateException(ERR_MSG);
}
return (T) context.getBean(name);
}
}
您需要让Spring扫描此类以使其工作。
然后,在您的内@EntityClass
,执行以下操作:
public void setCurrentLanguage(){ GestoreMessaggi gestoreMessaggi = Spring.bean(GestoreMessaggi.class);
gestoreMessaggi.gest();
}
仅此而已。请注意,你不会需要自动装配GestoreMessaggi
成你的@Entity
了。还请注意,
,因为它会将您的域类(您的@Entity
类)耦合到Spring类。
如果您选择选项2,那么您所需要做的就是让Spring像往常一样解决自动装配问题,但要
(即在dao或服务中),并且如果您的实体需要您用一些消息或其他内容来填充它,只需对其调用一个setter。(然后由您决定是否设置@Entity
s属性@Transient
,具体取决于您的要求)。
以上是 自动装配不适用于Class @Entity 的全部内容, 来源链接: utcz.com/qa/402621.html