【问题标题】:Accessing DAO Service methods from non managedbeans从非托管 bean 访问 DAO 服务方法
【发布时间】:2013-02-28 05:34:47
【问题描述】:

我正在使用 Spring 3 和 Hibernate 4

如何在非 ManagedBean 中使用以下内容

@Inject 
EmployeeService employeeService 

或者,如果我想访问 DAO 方法,我必须将其设为 ManagedBean

@Named("mymanagedbean")
@ViewAccessScoped 

我有几个 Converter 类,为了访问 DAO 服务方法,我必须将其用作 ManagedBean,即使它们不是 ManagedBeans。

调用DAO 服务方法的最佳方法是什么?

谢谢

【问题讨论】:

    标签: java spring hibernate managed-bean


    【解决方案1】:

    你需要实现Spring接口ApplicationContextAware,然后设置ApplicationContext。然后你需要提供静态方法来获取 bean 实例。

    public class SpringApplicationContext implements ApplicationContextAware {
    
    private static ApplicationContext CONTEXT;
    
    public void setApplicationContext(ApplicationContext context)
            throws BeansException {
        CONTEXT = context;
    }
        public static Object getBean(String beanName) { ...}
        public static <T> T getBean(Class<T> arg0) {...}
    

    然后在您的非托管 bean 中,您可以通过传入 EmployeeService.class 作为参数或 bean 名称作为参数来调用 SpringApplicationContext.getBean 方法。

    【讨论】:

      【解决方案2】:

      如果您想保持Converter 类的清洁并使用依赖项注入(强烈建议您这样做,以便能够轻松地测试该类)而不是手动引入其依赖项的类,您可以使用 Spring 的能力来配置在应用程序上下文之外创建的预先存在的对象。请参阅 Spring 的参考文档 here 中的相关部分。

      【讨论】:

        【解决方案3】:

        这是一个工作示例(与 zagyi 的回答相关)。应用程序使用 Spring Roo,因此使用 aspectj。

        @FacesConverter("example.entity.converter")
        @Configurable
        public class EntityConverter implements Converter {
        
            @Resource
            MyDAO dao;
        
            @Override
            public Object getAsObject(FacesContext context, UIComponent component,
                String value) {
        
                Entity obj;
        
                try {
                    obj = dao.getEntity(Long.valueOf(value));
                } catch( NumberFormatException e ) {
                    throw new ConverterException( message );
                }
                return obj;
            }
        
            @Override
            public String getAsString(FacesContext context, UIComponent component,
                 Object value) {
        
                Entity obj = (Entity) value;
                return (obj != null) ? obj.getId().toString() : "";
            }
        }
        

        道类

        @Repository("myDAO")
        public class MyDAOImpl implements MyDAO {
            ...
        }
        

        【讨论】:

          【解决方案4】:

          我已经设法在没有@Inject 的情况下使用以下方法在Converter 中获得DAO 方法,并在实现InterfaceEmployeeService 类中获得我定义为@Service(value="employeeService") 的DAO 方法

          EmployeeService employeeService = 
          (EmployeeService)facesContext.getApplication().getELResolver().
          getValue(facesContext.getELContext(), null,
          "employeeService");
          

          【讨论】:

          • 我不确定您在这里使用的是哪种 api,但这并不重要。我想在我的回答中说明的一点是,无论您如何在需要它的类中获得EmployeeService 实例,该类仍然引入它自己的依赖项。现在试着为那个类写一个测试,你就会明白为什么会出现问题:在测试中你必须确保有一个成熟的“facesContext”(不管它是什么)。更好(或更简洁)的方法是从外部注入该依赖项。我链接的文档解释了您如何使用非 Spring 托管对象执行此操作。
          猜你喜欢
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-02
          • 1970-01-01
          • 1970-01-01
          • 2012-08-27
          • 1970-01-01
          相关资源
          最近更新 更多