当前位置: 首页 > 面试题库 >

自动装配不能在类@Entity中工作

司徒胤
2023-03-14
问题内容

我有一个叫做 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距离不为null,仅 messageSource 为null
*

重要说明 :仅当我从标注为 @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"/>

谢谢


问题答案:

您可以采用两种方法:

  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了。还请注意,
Spring和大多数社区都不推荐这种方法 ,因为它将域类(您的@Entity类)耦合到Spring类。

如果您选择选项2,那么您所需要做的就是让Spring像往常一样解决自动装配问题,但要 在您的实体之外
(即在dao或服务中),并且如果您的实体需要您用一些消息或其他内容来填充它,只需对其调用一个setter。(然后,由您决定是否设置@Entitys属性@Transient,具体取决于您的要求)。



 类似资料:
  • 问题内容: 我想在servlet中使用spring自动装配,所以这是我的代码: 而用注释 和我的applicationContext.xml: 有时自动装配有效,有时却无效(对spring bean systemPropertyDao的引用为null),有人可以告诉我是否缺少什么吗? 问题答案: 我在以下链接中遵循了该解决方案,并且工作正常: 从JBoss中的servlet访问Spring Bea

  • 问题内容: 我有一个需要在类中自动装配的bean 。 但是当我尝试时@Autowire Item ,出现以下异常。 如何在Spring中自动装配通用类型? 问题答案: 一个简单的解决方案是升级到Spring 4.0,因为它将自动将泛型视为的一种形式,如下所示: 实际上,你甚至可以在插入列表时自动嵌套嵌套的泛型,如下所示: 如何运作? 新ResolvableType类提供了实际使用泛型类型的逻辑。你

  • 问题内容: 我的文凭项目有一个大问题,如果你们能帮助我,我将非常高兴!我做了一个Maven多模块项目,有3个“核心项目” :(父母) :包含所有的实体和接口域模型是由需要 和对 :将GUI和Hessian关联起来 :这里是我的仓库,我到数据库连接和接口的实现 和具有在Maven作为依赖。 现在,每次尝试在Tomcat上启动服务器时,都会出现以下错误: 模型库: 卡萨: MeinRemoteDien

  • 我刚刚下载了VisualStudio代码,我的Intellisense没有自动工作。 控制这一点的两个设置似乎设置正确: 当我开始输入并按下“CTRL空间”时,我确实会得到一个智能感知菜单,但这给了我一个所有东西的列表,而不是专门针对我的对象的东西。 我做错了什么?

  • 问题内容: 是否可以在用Java编写的Spring配置中使用Spring的注释? 例如: 显然,不能直接实例化DataSource接口,但是为了简化起见,我在这里直接实例化了它。当前,当我尝试上述操作时,数据源对象仍然为null,并且Spring不会对其进行自动接线。 我通过返回一个Hibernate 对象成功地工作了。 所以我的问题特别是:是否有办法针对a ?或更笼统地说,在Spring Jav

  • 主要内容:Spring 自动装配,自动装配规则,示例我们把 Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为“装配”。 Spring 的 IOC 容器虽然功能强大,但它本身不过只是一个空壳而已,它自己并不能独自完成装配工作。需要我们主动将 Bean 放进去,并告诉它 Bean 和 Bean 之间的依赖关系,它才能按照我们的要求完成装配工作。 在前面的学习中,我们都是在 XML 配置中通过 <constructor-arg>和 <