自动装配不适用于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"/>

谢谢

回答:

您可以采用两种方法:

  1. 尝试从@Entity类的方法中获取Spring管理的Bean的实例
  2. 按照@Stijn Geukens的建议更改设计,并使您的实体成为POJO,而没有任何逻辑或依赖项注入机制

如果通过选项1,则必须显式访问Spring的上下文并检索所需的bean实例:

@Component

public 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。(然后由您决定是否设置@Entitys属性@Transient,具体取决于您的要求)。

以上是 自动装配不适用于Class @Entity 的全部内容, 来源链接: utcz.com/qa/402621.html

回到顶部