0

我正在使用 Spring 3 和 Hibernate 4

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

@Inject 
EmployeeService employeeService 

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

@Named("mymanagedbean")
@ViewAccessScoped 

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

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

谢谢

4

4 回答 4

1

如果你想保持你的Converter类干净并使用依赖注入(强烈推荐这是为了能够轻松地测试类)而不是手动引入它的依赖项,你可以使用 Spring 配置预先存在的对象的能力在应用程序上下文之外创建。请在此处查看 Spring 参考文档中的相关部分。

于 2013-02-28T08:27:57.530 回答
1

这是一个工作示例(与 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 {
    ...
}
于 2013-04-21T12:50:22.453 回答
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 中,您可以SpringApplicationContext.getBean通过EmployeeService.class作为参数或 bean 名称作为参数传入来调用方法。

于 2013-02-28T05:56:11.280 回答
0

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

EmployeeService employeeService = 
(EmployeeService)facesContext.getApplication().getELResolver().
getValue(facesContext.getELContext(), null,
"employeeService");
于 2013-02-28T10:31:45.450 回答