问题描述
如果我从Spring 4.1.7.RELEASE移动到4.2.1.RELEASE,Google App Engine引发 java.lang.NoClassDefFoundError
$当Spring Security抛出
AccessDeniedException
(AffirmativeBased.java:83)时,b $ b 我知道我无法访问请求的资源。我希望spring能够在那之后显示登录页面,但是自从Spring 4.2以后,它不起作用了:()
$ b $
[INFO] java.lang。 NoClassDefFoundError:java.util.ResourceBundle $ Control是一个受限制的类,请参阅Google App Engine开发人员指南获取更多详细信息:
$ p为了在GAE上运行Spring 4.2.1并使用全局方法安全性,我必须将消息源设置为StaticMessageSource而不是ResourceBundleMessageSource,这是造成这种情况的原因。问题。不幸的是,声明messageSource bean不仅是必须完成的一件事。
[INFO],位于com.google.appengine.tools.development.agent.runtime.Runtime。 org.springframework.support.ResourceBundleMessageSource的
[INFO] $ 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.supp ort.ResourceBundleMessageSource.resolveCodeWithoutArguments(ResourceBundleMessageSource.java:234)
[信息]在org.springframework.context.support.AbstractMessageSource.getMessageInternal(AbstractMessageSource.java:218)
[信息]在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)
[信息]在org.springframework.security.access.intercept.aspectj.AspectJMethodSecurityInterceptor.invoke(AspectJMethodSecurityInterceptor.java:43)
[信息]在org.springframework.security.access.intercept.aspectj.aspect.AnnotationSecurityAspect。 AJC $约$ org_springframework_securit y_access_intercept_aspectj_aspect_AnnotationSecurityAspect $ 1 $ c4d57a2b(AnnotationSecurityAspect.aj:63)
[INFO] at xx.xxx.controllers.PortalController.home(PortalController.java:51)
@Bean(name =messageSource)
public MessageSource messageSource(){
StaticMessageSource messageSource = new StaticMessageSource();
返回messageSource;
$ b此处使用的基于AffirmativeBased的访问决策管理器由GlobalMethodSecurityConfiguration.accessDecisionManager( )并且不是Spring bean,所以setMessageSource()方法不会被执行,因此它不是
MessageSourceAware
。这个解决方案是手动设置这个messageSource:
@Configuration
@EnableGlobalMethodSecurity
public class MethodSecurityConfiguration扩展GlobalMethodSecurityConfiguration {
@Inject
private MessageSource messageSource;
$ b @Override
protected AccessDecisionManager accessDecisionManager(){
AffirmativeBased manager =(AffirmativeBased)super.accessDecisionManager();
manager.setMessageSource(messageSource);
退货经理;
}
}
If I move from Spring 4.1.7.RELEASE to 4.2.1.RELEASE Google App Engine raises
java.lang.NoClassDefFoundError
when Spring Security throws
AccessDeniedException
(AffirmativeBased.java:83)I know I do not have access to requested resource. I expect spring to show login page after that but since Spring 4.2 it does not work :(
[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)
解决方案To run Spring 4.2.1 on GAE and use global method security I had to set message source to StaticMessageSource instead of ResourceBundleMessageSource which caused the problem. Unfortunately declaring the messageSource bean is not only one thing that has to be done.
@Bean(name = "messageSource") public MessageSource messageSource() { StaticMessageSource messageSource = new StaticMessageSource(); return messageSource; }
AffirmativeBased access decision manager which is used here is created by method GlobalMethodSecurityConfiguration.accessDecisionManager() and is not a Spring bean so setMessageSource() method is not executed so it is not
MessageSourceAware
. The solution for that is to set this messageSource manually:@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; } }
这篇关于GAE和java.util.ResourceBundle上的Spring 4.2.1 $ Control是一个受限制的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!