首页 文章

Spring-boot - 如何使用Resteasy JAX-RS和Spring MVC控制器

提问于
浏览
1

我有一个jax-rs资源,我试图转换为spring boot . 我让它们工作,但看起来像一些jax-rs资源,它们作为其他项目的依赖项包含在项目中 . 我知道这应该是一项服务!无论如何所以我可以对该库进行更改并使它们与mvc兼容,但是还有另一种方法可以让spring servlet同时工作吗?我使用所有基于java的配置btw no xml .

主要的应用程序类目前注释如下,除非我在url-mapping中添加“/”,这样可以解决这个问题 . 如果调度程序servlet可以为每个/请求找到处理程序,我甚至不知道为什么我应该添加它 .

@SpringBootApplication(exclude = { EmbeddedServletContainerFactory.class })
@EnableAsync
@ImportResource(value = { "classpath:springmvc-resteasy.xml" })
public class Application implements AsyncConfigurer, DisposableBean { .. }

我认为使用上面的Spring DispatcherServlet仍处于控制之前,它知道休息容易处理的dropradapter . 默认情况下,启动也会映射'/'下的所有内容,所以我不明白为什么它不起作用 . 我在击中jax-rs uri时得到404,spring mvc uri正常工作 .

我尝试添加以下内容,但之后一切都停止了 .

@Bean
    public ServletRegistrationBean initServlet(DispatcherServlet dispatcherServlet) {

        ServletRegistrationBean servletRegistrationBean 
        = new ServletRegistrationBean(dispatcherServlet, false,"/jaxrs-api/*", "/mvc-api/*");

        servletRegistrationBean
    .setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);

        return servletRegistrationBean;
    }

我可以看到在上下文初始化时正在加载以下bean以便重新安装 .

resteasy.deployment
resteasy.registry
resteasy.dispatcher
resteasy.providerFactory
resteasy.spring.bean.processor
abstract.resteasy.handlerMapping
resteasy.handlerMapping
resteasy.handlerAdapter
resteasy.exception.handler
resteasy.no.resource.found.view
reateasy.error.view.resolver

1 回答

  • 0

    看起来事情在经过一些尝试和错误后再次开始工作,这不是应该的方式! Spring-boot真的应该在这里记录它如何与spring mvc和jax-rs共存 .

    这是我所做的一系列改变 .

    我将@EnableWebMvc添加到我的Application.java类中,或者它可以在任何其他@Configuration类上

    @SpringBootApplication(exclude = { EmbeddedServletContainerFactory.class })
    @EnableAsync
    @EnableWebMvc
    @ImportResource(value = { "classpath:springmvc-resteasy.xml" })
    public class Application implements AsyncConfigurer, DisposableBean { .. }
    

    事后来看,我知道这会产生一些问题而且确实存在!我的其他MessageConverter停止工作 . 我在Application.java中有以下内容

    @Bean
      public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper scalaObjectMapper = new ScalaObjectMapper();
        //scalaObjectMapper.enable(features)
        //objectMapper.registerModule(new DefaultScalaModule());
        scalaObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jsonConverter.setObjectMapper(scalaObjectMapper);
        return jsonConverter;
      }
    

    现在我不得不将它移动到另一个配置类,它覆盖WebMvcConfigurerAdapter来定制spring mvc bean .

    @Component
    @Configuration
    public class WebMvcCustomConfig extends WebMvcConfigurerAdapter {
    
      /**
       * Registering Scala ObjectMapper
       * @return
       */
      @Bean
      public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper scalaObjectMapper = new ScalaObjectMapper();
     scalaObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jsonConverter.setObjectMapper(scalaObjectMapper);
        return jsonConverter;
      }
    
      @Override
      public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    
        //converters.add(ScalaObjectMapper);
        super.configureMessageConverters(converters);
        converters.add(customJackson2HttpMessageConverter());
      }
    }
    

    所以看起来现在Spring MVC有一些控制而不是Spring Boot . 我确信当我有一些额外的组件,例如swagger2集成或类似的东西时,这将会破裂 .

相关问题