【问题标题】:Spring Boot - SOAP endpoint conflict with HandlerMapping / DispatcherSpring Boot - SOAP 端点与 HandlerMapping / Dispatcher 冲突
【发布时间】:2022-10-23 18:34:35
【问题描述】:

我有一个带有百里香休息+肥皂的春季靴子项目。

我有一个页面:

Show the front end
+ Rest Requests
+ Soap requests.

问题源于“肥皂“当我必须创建端点.

当我将此端点添加到配置中时:

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

我正在使用带有 apache cfx 的肥皂。我用于项目的 cfx 配置是here

我发现了一个稍微意外的错误。

如果我在我的配置中运行这个配置,我会遇到所有这些问题:

  1. 我的配置里面的配置

    我收到以下类型的错误:

    创建名称为“resourceHandlerMapping”的 bean 时出错 类路径资源 [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.web.servlet.HandlerMapping]:工厂 方法“resourceHandlerMapping”抛出异常;嵌套异常是 java.lang.IllegalStateException:没有设置 ServletContext

    我尝试使用@EnableWebMvc,但我遇到了一个问题:

    创建名称为“resourceHandlerMapping”的 bean 时出错 类路径资源 [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]

    此时我已经尝试过:添加百里香的路径

    ClassLoaderTemplateResolver secondaryTemplateResolver = new ClassLoaderTemplateResolver();
    

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

    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一样映射传统方式,在另一个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] 无法正确发送

    据我了解,它使映射的路线一团糟 我的理解是,当我注册一个 servlet 时,“前一个或当前”会丢失,并且它没有与 ServletRegistrationBean 映射。

    有没有什么办法解决这一问题?我是否必须使用 ClassLoaderTemplateResolver 或 UrlBasedViewResolver 手动映射所有路线?我试过了,但它会抛出同样的错误。 如果在进行中更改“每次都会出现不同的错误”。这就是为什么我正在寻找一种直接解决问题的方法。

    笔记: 我正在使用 apache.cxf 插件

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    我找到了一种通过以另一种方式声明它来使其工作的方法。 我认为每天我对 Spring/Spring Boot 的工作原理的了解越来越少。是时候回到 JEE 了吗?

    1 - 似乎如果您将调度程序留空(显然它会使用空箭头函数给出错误),但是当您声明 ServletRegistrationBean 时,Spring 会询问您“它可能会自动采用路由”

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

    2 - 如果我声明它有点不同,它能够正确检测到映射

    @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 2017-07-19
      • 2018-07-03
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多