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

没有在上下文中注册任何bean解析器来解析对bean的访问

公羊子真
2023-03-14
问题内容

我正在尝试使用Java Config来实现方法安全性,但是出现错误:-

org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): No bean resolver registered in the context to resolve access to bean 'appPermissionEvaluator'

该方法是:-

@PreAuthorize("@appPermissionEvaluator.hasSystemPermission()")
public String something() {
    ...
}

Config类的定义是(MethodSecurityConfig.java):-

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Bean
    public AppPermissionEvaluator appPermissionEvaluator() {
        return new AppPermissionEvaluator();
    }

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler =
                new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(appPermissionEvaluator());
        return expressionHandler;
    }

    ...
}

我检查了是否可以在相同的类中自动装配Bean,还发现默认的hasPermission()方法在实现它们时就可以正常工作,唯一的问题是从SpEL读取Bean。我不知道怎么了。有指针吗?

我正在使用Spring 4.1.5和Spring Security 3.2.7


问题答案:

您需要确保在DefaultMethodSecurityExpresssionHandler上设置ApplicationContext。例如:

@Autowired
private ApplicationContext context;

@Override
protected MethodSecurityExpressionHandler expressionHandler() {
    DefaultMethodSecurityExpressionHandler expressionHandler =
            new DefaultMethodSecurityExpressionHandler();
    expressionHandler.setPermissionEvaluator(appPermissionEvaluator());
    expressionHandler.setApplicationContext(context);
    return expressionHandler;
}

另外,更简洁地说,如果您将单个PermissionEvaluator定义为Bean,Spring
Security将自动选择它(无需覆盖expressionHandler())。例如:

@Bean
public PermissionEvaluator appPermissionEvaluator() {
    ...
}


 类似资料:
  • 本文向大家介绍Spring中BeanFactory解析bean详解,包括了Spring中BeanFactory解析bean详解的使用技巧和注意事项,需要的朋友参考一下 在该文中来讲讲Spring框架中BeanFactory解析bean的过程,该文之前在小编原文中有发表过,先来看一个在Spring中一个基本的bean定义与使用。 Spring配置文件root.xml定义如下: 下面使用XmlBean

  • 我刚刚发现了一种我无法理解的Spring的行为。我使用的是Spring Boot 1.5。十、 在一个配置类中,我声明了两个不同的bean。 然后,我有一个类,它应该使用名为的bean。 因为我指定了我想要使用注释注入的bean的名称,所以我希望Spring注入名为的bean。但是,在注入过程中实际上使用了名为的bean。 事实证明,问题在于在配置类中声明bean的方法的名称。两者都是colled

  • 问题内容: 我有以下配置文件: 我使用以下VM选项运行应用程序: 因此,我希望我的应用程序在启动时加载特定的属性文件。但是由于某些原因,目前未处理注释,属性为。另一方面,如果我已经通过xml文件进行了配置,那么一切都会按预期进行。Xml文件示例: 如果我尝试将属性值注入到另一个Spring配置文件中- 它已正确注入。如果将我的bean创建移动到该配置文件-字段值再次为null。 解决方法是,使用以

  • 问题内容: 我正在与Retrofit和GSON合作。我有一个作为JSON数组的JSON响应,但我不知道如何使用模型类来解析它。我的回答如下: 问题答案: 只需在回调中调用字符串列表,它就可以完成工作…

  • 本文向大家介绍Spring @Bean注解配置及使用方法解析,包括了Spring @Bean注解配置及使用方法解析的使用技巧和注意事项,需要的朋友参考一下 使用说明 这个注解主要用在方法上,声明当前方法体中包含了最终产生 bean 实例的逻辑,方法的返回值是一个 Bean。这个 bean 会被 Spring 加入到容器中进行管理,默认情况下 bean 的命名就是使用了 bean 注解的方法名。@B

  • 我尝试将我的应用程序配置为使用Spring数据 neo4j 。 但是当我提交我的应用程序时,我得到了这个堆栈跟踪跟踪: 这是我的UserRepository: 这是我的porm.xml http://maven.apache.org/maven-v4_0_0.xsd"