我正在尝试部署apache-camel spring-security-example https://github.com/apache/camel/tree/master/examples/camel-example-spring-security。
我遵循的步骤。
然后引发了以下异常。
2016-09-30 10:07:37,517 [main] ERROR ContextLoader
- 上下文初始化失败org.springframework.beans.factory.BeanCreationException:错误 创建名为' accessDecisionManager'的bean在类路径中定义 resource [camel-context.xml]:bean的实例化失败;嵌套 异常是org.springframework.beans.BeanInstantiationException: 无法实例化 [org.springframework.security.access.vote.AffirmativeBased]:不 找到默认构造函数;嵌套异常是 java.lang.NoSuchMethodException: org.springframework.security.access.vote.AffirmativeBased。()at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 在 org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 在 org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:782) 在 org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:424) 在 org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:774) 在 org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249) 在 org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1242) 在 org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717) 在 org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494) 在 org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:298) 在 org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 在 org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:172) 在 org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 在 org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:229) 在 org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 在 org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95) 在org.eclipse.jetty.server.Server.doStart(Server.java:282)at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.java:65)at at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) 在 org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:520) 在 org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:365) 在 org.mortbay.jetty.plugin.JettyRunMojo.execute(JettyRunMojo.java:523) 在 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133) 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108) 在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76) 在 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116) 在org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361)at at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)at org.apache.maven.cli.MavenCli.execute(mavenCli.java:584)at at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213)at at org.apache.maven.cli.MavenCli.main(MavenCli.java:157)at at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:497)at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 在 org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 在 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 引起:org.springframework.beans.BeanInstantiationException: 无法实例化 [org.springframework.security.access.vote.AffirmativeBased]:不 找到默认构造函数;嵌套异常是 java.lang.NoSuchMethodException: org.springframework.security.access.vote.AffirmativeBased。()at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:85) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098) ......还有55个
请有人告诉我原因。
答案 0 :(得分:0)
尽管它很旧,但我也不得不四处寻找解决2.17.x上的camel-eaxmple-spring-security示例的解决方案(我猜想是Others)。我想同时使用HTTP GET和POST进行BASIC身份验证。我不认为这是一个错误,只是Spring Security版本可能有所更改,因此自从首次创建2.17.x示例以来就没有对其进行更新。
为了使示例生效,已经对示例进行了一些更改。这是我所做的更改的列表,仅是一处; 1)更改
<spring-security:intercept-url pattern="/camel/**" access="ROLE_User"/> to
<spring-security:intercept-url pattern="/camel/**" access="hasRole ('ROLE_User')"/>
(不记得我在哪里找到的链接) 2)将访问决策管理器bean更改为包括构造函数,链接http://stackoverflow.com/questions/29495283/no-default-constructor-found-nested-exception-is-java-lang-nosuchmethodexceptio也会处理此问题,我的更改也是如此
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<constructor-arg>
<bean class="org.springframework.security.access.vote.RoleVoter"/>
</constructor-arg>
<property name="allowIfAllAbstainDecisions" value="true"/>
</bean>
这些更改使该示例可以按预期的方式进行HTTP GET请求的工作,但是我也希望HTTP POST请求能够工作,但是“原样”我仍然遇到403错误-这些错误可能是来自其他服务器到我的服务器-而不是一个Web客户端-虽然我不建议禁用csrf,但我认为这是可以接受的。为了禁用csrf,我添加了
<spring-security:csrf disabled="true"/>
到<spring-security:http>
设置
要进行HTTP POST调用,您需要添加带有Base64编码凭据的Authorization标头
<!-- for bob and bobspassword -->
<setHeader headername="Authorization">
<constant>Basic amlt0mppbXNwYXNzd29yZA==</constant>
</setHeader>
您还必须检查要发送的正文的Content-Type设置是否正确,例如application / json ...