spring Sping Boot - SOAP端点与HandlerMapping /调度程序冲突

9bfwbjaz  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(176)

我有一个与thymeleaft休息+肥皂的春 Boot 项目。
我有一个页面可以:

Show the front end
+ Rest Requests
+ Soap requests.

当我必须创建终结点时,问题源于“Soap”。
当我将此端点添加到配置时:

@Bean
public ServletRegistrationBean<CXFServlet> dispatcherServlet() {
    return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/soap-api/*");
}
@Bean
@Primary
public DispatcherServletPath dispatcherServletPathProvider() {
    return () -> "";
}

我正在使用一个带有apachecfx的soap。我的项目使用的cfx配置是here
我发现了一个小小的意外错误。
如果我在我的配置中运行这个配置,我会遇到所有这些问题:
1.我的配置中的配置
我得到一个错误类型:
创建在类路径资源[org/springframework/ Boot /autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]中定义的名为“resourceHandlerMapping”的Bean时出错:通过工厂方法示例化Bean失败;嵌套的异常是一个嵌套的异常。无法示例化[org.springframework.web.servlet.处理程序Map]:工厂方法“resourceHandlerMapping”引发了异常;嵌套的异常是java.lang.IllegalStateException:未设置ServletContext
我尝试使用@EnableWebMvc,但遇到以下问题:
创建在类路径资源中定义的名为'resourceHandlerMapping'的Bean时出错[org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]
在这一点上我已经试过了:添加thymeleaft的路径

ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver();

但它不起作用。我也尝试过基本Map:

UrlBasedViewResolver resolve = new UrlBasedViewResolver();
        resolve.setPrefix("templates/");
        resolve.setSuffix(".html");

但也不管用。
1.配置超出我的配置
奇怪的是,如果我将该配置放在另一个java文件中,则不会出现任何问题,但当我访问该页面时,却会出现错误:
错误10788 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[...]:自定义错误页[/error]无法正确调度
所以我认为像Spring这样的传统Map方式,在另一个java配置中可以做到:

@Bean
public UrlBasedViewResolver viewResolver() {
    UrlBasedViewResolver resolver = new UrlBasedViewResolver();
    //resolver.setPrefix("/WEB-INF/view/");
    //resolver.setSuffix(".jsp");
    // THYMELEAFT
    resolver.setPrefix("templates/");
    resolver.setSuffix(".html");
    resolver.setViewClass(JstlView.class);
    return resolver;
}
// RESOURCES
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/", "/resources/")
            .setCachePeriod(3600)
            .resourceChain(true)
            .addResolver(new PathResourceResolver());
}
@Bean
public ResourceBundleThemeSource themeSource() {
    ResourceBundleThemeSource themeSource
            = new ResourceBundleThemeSource();
    themeSource.setDefaultEncoding("UTF-8");
    themeSource.setBasenamePrefix("themes.");
    return themeSource;
}

也不行。我现在就在这一点上。问题2有什么解决方案吗?
此时,我可以成功加载SOAP,但浏览器中的其他页面显示为404。在控制台中,我得到:自定义错误页[/error]无法正确调度
据我所知,它使Map的路由变得混乱,我的理解是,当我注册一个servlet时,“以前的或当前的”丢失了,而且它没有与ServletRegistrationBeanMap。

**有什么方法可以解决这个问题吗?**我必须用ClassLoaderTemplateResolver或UrlBasedViewResolver手动Map所有的路由吗?我试过了,但是它抛出了同样的错误。如果在前进的同时改变“每次都出现不同的错误”。这就是为什么我在寻找一种直接解决问题的方法。
注意:我使用的是apache.cxf插件

xj3cbfub

xj3cbfub1#

我已经找到了一种方法,通过用另一种方式声明它来使它工作。我想每天我都在越来越不理解Spring/Sping Boot 是如何工作的。是时候回到JEE了吗?
1 -看起来如果你让分派器为空(显然它会因为一个空箭头函数而失败),但是Spring要求你在声明ServletRegistrationBean时创建一个分派器。“那个调度员“可以”用空箭头函数自动得到路线”。

//    @Bean
//    public ServletRegistrationBean<CXFServlet> dispatcherServlet() {
//        return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/soap-api/*");
//    }

//    @Bean
//    @Primary
//    public DispatcherServletPath dispatcherServletPathProvider() {
//        return () -> "";
//    }

2 -如果我稍微声明它,它就能够正确地检测Map

@Bean
public ServletRegistrationBean servletRegistrationBean() {
    CXFServlet cxfServlet = new CXFServlet();
    ServletRegistrationBean servletRegistration =
            //new ServletRegistrationBean(cxfServlet, ServiceConstants.URL_PATH_SERVICES + "/*");
            new ServletRegistrationBean(cxfServlet,  "/soap-api/*");
    return servletRegistration;
}

问题来源:here

相关问题