【问题标题】:Spring 4.2.1 on GAE and java.util.ResourceBundle$Control is a restricted classGAE 上的 Spring 4.2.1 和 java.util.ResourceBundle$Control 是一个受限类
【发布时间】:2015-09-14 12:50:28
【问题描述】:

如果我从 Spring 4.1.7.RELEASE 迁移到 4.2.1.RELEASE,Google App Engine 会引发 java.lang.NoClassDefFoundError

当 Spring Security 抛出 AccessDeniedException (AffirmativeBased.java:83)

我知道我无权访问请求的资源。我希望 spring 在那之后显示登录页面,但是从 Spring 4.2 开始它不起作用:(

[INFO] java.lang.NoClassDefFoundError: java.util.ResourceBundle$Control is a restricted class. Please see the Google  App Engine developer's guide for more details.
[INFO]  at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:52)
[INFO]  at org.springframework.context.support.ResourceBundleMessageSource$MessageSourceControl.<init>(ResourceBundleMessageSource.java:417)
[INFO]  at org.springframework.context.support.ResourceBundleMessageSource$MessageSourceControl.<init>(ResourceBundleMessageSource.java:417)
[INFO]  at org.springframework.context.support.ResourceBundleMessageSource.doGetBundle(ResourceBundleMessageSource.java:314)
[INFO]  at org.springframework.context.support.ResourceBundleMessageSource.getResourceBundle(ResourceBundleMessageSource.java:284)
[INFO]  at org.springframework.context.support.ResourceBundleMessageSource.resolveCodeWithoutArguments(ResourceBundleMessageSource.java:234)
[INFO]  at org.springframework.context.support.AbstractMessageSource.getMessageInternal(AbstractMessageSource.java:218)
[INFO]  at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:136)
[INFO]  at org.springframework.context.support.MessageSourceAccessor.getMessage(MessageSourceAccessor.java:83)
[INFO]  at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:83)
[INFO]  at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:232)
[INFO]  at org.springframework.security.access.intercept.aspectj.AspectJMethodSecurityInterceptor.invoke(AspectJMethodSecurityInterceptor.java:43)
[INFO]  at org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect.ajc$around$org_springframework_security_access_intercept_aspectj_aspect_AnnotationSecurityAspect$1$c4d57a2b(AnnotationSecurityAspect.aj:63)
[INFO]  at xx.xxx.controllers.PortalController.home(PortalController.java:51)

【问题讨论】:

  • 您阅读了变更说明吗?有什么会破坏您的应用?

标签: java spring google-app-engine spring-mvc spring-security


【解决方案1】:

要在 GAE 上运行 Spring 4.2.1 并使用全局方法安全性,我必须将消息源设置为 StaticMessageSource 而不是导致问题的 ResourceBundleMessageSource。不幸的是,声明 messageSource bean 不仅是必须要做的一件事。

@Bean(name = "messageSource")
  public MessageSource messageSource() {
    StaticMessageSource messageSource = new StaticMessageSource();
    return messageSource;
  }

这里使用的基于肯定的访问决策管理器是由方法 GlobalMethodSecurityConfiguration.accessDecisionManager() 创建的,它不是 Spring bean,所以 setMessageSource() 方法没有被执行,所以它不是MessageSourceAware。解决方法是手动设置这个 messageSource:

@Configuration
@EnableGlobalMethodSecurity
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

  @Inject
  private MessageSource messageSource;

  @Override
  protected AccessDecisionManager accessDecisionManager() {
    AffirmativeBased manager = (AffirmativeBased)super.accessDecisionManager();
    manager.setMessageSource(messageSource);
    return manager;
  }
}

【讨论】:

    【解决方案2】:

    经过一些试验和错误,以下对我来说似乎工作正常:

    1. 将消息文件移动到 WEB-INF。
    2. 更新 Spring 配置以使用 ReloadableResourceBundleMessageSource 而不是 ResourceBundleMessageSource,例如在 XML 中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2017-08-30
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多