肥皂web服务的春季启动+ Apache CXF

问题描述:

我一直在研究春季启动。我遵循这个例子,并尝试使用this sample code创建一个简单的soap web服务。 遵循这整个样本。我运行我的应用程序时遇到了一个问题。以下是错误的堆栈跟踪。肥皂web服务的春季启动+ Apache CXF

2017-09-09 20:06:59.883 ERROR 7302 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean 
    at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_121] 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_121] 
    at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_121] 
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:570) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:697) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:640) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1484) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:425) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:395) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at com.posts.PostApplication.main(PostApplication.java:10) [classes/:na] 
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.ServletRegistrationBean 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_121] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_121] 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_121] 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_121] 
    ... 23 common frames omitted 

2017-09-09 20:06:59.884 INFO 7302 --- [   main] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot[email protected]6dbb137d: startup date [Sat Sep 09 20:06:58 PKT 2017]; root of context hierarchy 
2017-09-09 20:06:59.885 WARN 7302 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception thrown from LifecycleProcessor on context close 

java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: org.springframework.boot[email protected]6dbb137d: startup date [Sat Sep 09 20:06:58 PKT 2017]; root of context hierarchy 
    at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:427) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:999) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:958) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:750) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at com.posts.PostApplication.main(PostApplication.java:10) [classes/:na] 

2017-09-09 20:06:59.886 ERROR 7302 --- [   main] o.s.b.f.s.DefaultListableBeanFactory  : Destroy method on bean with name 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory' threw an exception 

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot[email protected]6dbb137d: startup date [Sat Sep 09 20:06:58 PKT 2017]; root of context hierarchy 
    at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:414) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:253) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578) [spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554) [spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961) [spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523) [spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.destroySingletons(FactoryBeanRegistrySupport.java:230) [spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968) [spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1030) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1006) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:958) [spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:750) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.6.RELEASE.jar:1.5.6.RELEASE] 
    at com.posts.PostApplication.main(PostApplication.java:10) [classes/:na] 

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 
    at java.lang.Class.getDeclaredMethods(Class.java:1975) 
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613) 
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524) 
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510) 
    at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:570) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:697) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:640) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:609) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1484) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:425) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:395) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:515) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:508) 
    at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1186) 
    at org.springframework.boot.SpringApplication.getExitCodeFromMappedException(SpringApplication.java:818) 
    at org.springframework.boot.SpringApplication.getExitCodeFromException(SpringApplication.java:804) 
    at org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:790) 
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:744) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 
    at com.posts.PostApplication.main(PostApplication.java:10) 
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.ServletRegistrationBean 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 24 more 

Process finished with exit code 1 

我想在spring启动时创建一个简单的soap web服务。我正在使用apache cfx来达到这个目的。

这是pom.xml文件。

+1

似乎pom.xml依赖关系出现错误,您能共享项目的pom.xml吗?我创建了一个类似的项目,但我必须相应地将'pom.xml'更改为https://start.spring.io/ –

+0

https://github.com/mumarm45/springboot/blob/master/pom中的当前版本。 XML。这是pom.xml文件。 –

org.springframework.boot.context.embedded.ServletRegistrationBean已从Spring版本1.5.x中删除。错误是由org.apache.cxf的版本引起的。cxf-spring-boot-starter-jaxws <version>3.1.7</version>因为它取决于从删除的org.spri...embedded.ServletRegistrationBean

只需更新org.apache.cxf cxf-spring-boot-starter-jaxws依赖于与SB 1.5.x

<dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-spring-boot-starter-jaxws</artifactId> 
     <version>3.1.11</version> 
    </dependency> 

更新Maven依赖兼容的版本,你会看到java.lang.NoClassDefFoundError异常将不再显示。

Here is one example about Spring Boot + Apache cxf

编辑

为了确保您的CXF Servlet的一个可能的解决方案是使用HTTP基本身份验证,春天开机时会自动配置安全过滤器链,以便在CXF前进行认证servlet的消耗,只要按照这样的步骤:

添加春季安全依赖

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 

只要您添加Spring安全依赖项,spring boot会自动使用http基本身份验证来保护所有http端点。如果您需要定制这个配置,这里有一个例子:

创建一个@Configuration类,从WebSecurityConfigurerAdapter和覆盖配置方法扩展以配置身份验证和授权过程:像这样

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 

     //credentials and roles to use 
     auth.inMemoryAuthentication().withUser("soapuser").password("secret").roles("ADMIN"); 

    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception{ 

     //this configuration define that every request is authorized only to Admin roles and authenticated users. 
     http 
       .authorizeRequests() 
       .anyRequest() 
       .hasRole("ADMIN") 
       .anyRequest() 
       .authenticated() 

       //this configuration define an http basic authentication 
       .and().httpBasic() 

       //disable csfr 
       .and().csrf().disable(); 
    } 

} 

最后,我想建议始终执行HTTP通过HTTPS基本身份验证,也可以通过application.properties配置完成:

server.port=9443 
server.ssl.enabled=true 
server.ssl.key-store=classpath:keystore.jks 
server.ssl.key-store-password=changeit 
server.ssl.key-password=changeit 

在这个例子中,应用程序将运行通过HTTPS在9443端口https://localhost:9443/

这篇文章列出了其他的替代品,通过春季安全Spring Security Apache cxf安全的Apache CXF。我还更新了git repo来展示如何使用spring引导和apache cxf实现spring安全性。

+0

谢谢,你有没有使用弹簧安全保护肥皂api?任何建议你可以给。 –

+0

嗨,我只是添加有关安全性的新信息,您也可以在git仓库中查看示例。 –

+0

基本上,我想要使用基于令牌的身份验证来保护我的soap api。不能只有安全启用。 –