添加@PreAuthorize注释时的NoSuchBeanDefinitionException

时间:2012-04-09 09:41:09

标签: spring gwt spring-security requestfactory

我正在尝试集成我的GWT应用程序和Spring Security。当我向我的DAO类的方法添加@PreAuthorize("hasRole('ROLE_USER')")注释时,会出现以下异常:

  

没有定义[server.dao.ElementServiceDAO]类型的唯一bean:   预计单豆但发现0

DaoServiceLocator找不到DAO bean,但在调试模式下,我在ApplicationContext实例中看到了elementServiceDAO bean。

我的DAO课程如下:

@Service
public class ElementServiceDAO extends EntityDAO {

@PreAuthorize("hasRole('ROLE_USER')")
@SuppressWarnings("unchecked")
public Layer getFullRenderingTopology() {
...
}

}

DAO服务定位器的代码:

public class DaoServiceLocator implements ServiceLocator {

@Override
public Object getInstance(final Class<?> clazz) {
    try {
        final HttpServletRequest request = RequestFactoryServlet
                .getThreadLocalRequest();

        final ServletContext servletContext = request.getSession()
                .getServletContext();

        final ApplicationContext context = WebApplicationContextUtils
                .getWebApplicationContext(servletContext);

        return context.getBean(clazz);
    } catch (final Exception e) {
        throw new RuntimeException(e);
    }
}
}

applicationContext-security.xml:

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="operator" password="operator" authorities="ROLE_USER, ROLE_ADMIN" />
            <user name="guest" password="guest" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

<global-method-security pre-post-annotations="enabled" /> 

请给我任何建议!

1 个答案:

答案 0 :(得分:1)

ElementServiceDAO实现接口时(在您的情况下 - 通过EntityDAO传递),Spring默认创建基于接口的代理来应用安全性方面。因此,应用程序上下文中的elementServiceDAO是不是ElementServiceDAO实例的代理,因此无法按类型检索它。

您需要

  • 强制创建基于目标类的代理,如下所示

    <global-method-security 
        pre-post-annotations="enabled" proxy-target-class = "true" /> 
    
  • 或为ElementServiceDAO创建业务接口,并使用该接口而不是实现类。

另见: