将弹簧靴与RESTEasy集成

史蒂文·斯兰斯克(Steven Schlansker)

我正在尝试对Spring Boot应用程序进行原型设计。我来自Guice JAX-RS应用程序,因此与Spring MVC相比,我更喜欢标准JAX-RS批注。我已经把Jetty装上了:

@Configuration
@Import({ResteasyBootstrap.class, SpringBeanProcessorServletAware.class, HttpServletDispatcher.class})
public class EmbeddedJetty {
    @Bean
    @Singleton
    public EmbeddedServletContainerFactory servletContainer() {
        JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
        factory.setPort(9000);
        factory.setSessionTimeout(10, TimeUnit.MINUTES);
        return factory;
    }
}

但是,我只是不知道如何正确连接RESTEasy。通过上面的操作SpringBeanProcessorServletAware,看起来似乎在最终使用ServletContextServletContextAware之前没有注入

java.lang.NullPointerException: null
    at org.jboss.resteasy.plugins.spring.SpringBeanProcessorServletAware.getRegistry(SpringBeanProcessorServletAware.java:30)
    at org.jboss.resteasy.plugins.spring.SpringBeanProcessor.postProcessBeanFactory(SpringBeanProcessor.java:247)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:284)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:174)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:680)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:522)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)

我也尝试使用SpringContextLoaderListener,但这似乎与spring-bootAnnotationConfigEmbeddedWebApplicationContext冲突

我正在使用spring-boot 1.3.3和spring-framework 4.3.0.rc1

杰夫·S

另一个答案将不会像Spring bean那样拥有您的资源,此自动配置将正确地集成它们:

配置类:

@Configuration
@ConditionalOnWebApplication
public class RestEasyAutoConfigurer {


    private Environment environment;   

    @Bean(name = "resteasyDispatcher")
    public ServletRegistrationBean resteasyServletRegistration() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HttpServletDispatcher(), getPrefix()
                + "/*");
        registrationBean.setInitParameters(ImmutableMap.of("resteasy.servlet.mapping.prefix", "/rs/")); // set prefix here
        registrationBean.setLoadOnStartup(1);
        return registrationBean;
    }

    @Bean(destroyMethod = "cleanup")
    public static RestEasySpringInitializer restEasySpringInitializer() {
        return new RestEasySpringInitializer();
    }    

    @Bean
    // use Spring Boot configured Jackson
    public CustomResteasyJackson2Provider jackson2Provider(ObjectMapper mapper) {
        return new CustomResteasyJackson2Provider(mapper); 
    }

    public static class RestEasySpringInitializer
            implements
                ServletContextInitializer,
                ApplicationContextAware,
                BeanFactoryPostProcessor {

        private ResteasyDeployment deployment;

        private ConfigurableApplicationContext applicationContext;

        private ConfigurableListableBeanFactory beanFactory;

        public void cleanup() {
            deployment.stop();
        }

        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            ListenerBootstrap config = new ListenerBootstrap(servletContext);
            deployment = config.createDeployment();
            deployment.start();

            servletContext.setAttribute(ResteasyProviderFactory.class.getName(), deployment.getProviderFactory());
            servletContext.setAttribute(Dispatcher.class.getName(), deployment.getDispatcher());
            servletContext.setAttribute(Registry.class.getName(), deployment.getRegistry());

            SpringBeanProcessor processor = new SpringBeanProcessor(deployment.getDispatcher(),
                    deployment.getRegistry(), deployment.getProviderFactory());
            processor.postProcessBeanFactory(beanFactory);
            applicationContext.addApplicationListener(processor);
        }

        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        }

        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = (ConfigurableApplicationContext) applicationContext;
        }
    }
}

和Jackson提供商:

@Provider
@Consumes({"application/*+json", "text/json"})
@Produces({"application/*+json", "text/json"})
public class CustomResteasyJackson2Provider extends ResteasyJackson2Provider {
    private ObjectMapper mapper;

    public CustomResteasyJackson2Provider(ObjectMapper mapper) {
        this.mapper = mapper;
    }

    @Override
    public ObjectMapper locateMapper(Class<?> type, MediaType mediaType) {
        return Optional.ofNullable(_mapperConfig.getConfiguredMapper()).orElse(mapper);
    }    
}

注意:这是Spring Boot 1.3.3 / RESTEasy 3.0.16的有效配置

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

部署弹簧靴胖子

来自分类Dev

Swagger 的弹簧靴骨架

来自分类Dev

从弹簧靴开始

来自分类Dev

Hazelcast 带弹簧靴

来自分类Dev

带 mockito 的弹簧靴

来自分类Dev

将弹簧配置映射到集成流程

来自分类Dev

将弹簧配置映射到集成流程

来自分类Dev

弹簧靴 2x。休息api。将失败的字符串转换为日期

来自分类Dev

伸缩弹簧靴式装载机

来自分类Dev

弹簧靴-独立Neo4j

来自分类Dev

弹簧靴+ jboss =第403页

来自分类Dev

QAF黄瓜用弹簧靴testNG

来自分类Dev

弹簧靴oaut2属性

来自分类Dev

骆驼弹簧MVC集成

来自分类Dev

如何调试弹簧集成

来自分类Dev

RestEasy Spring集成错误

来自分类Dev

与RESTEasy的Spring集成

来自分类Dev

带有外部调度程序的骆驼弹簧靴

来自分类Dev

如何用黄瓜激活弹簧靴配置文件

来自分类Dev

带弹簧靴的弹性搜索不起作用

来自分类Dev

尝试发布到休息端点时出错。弹簧靴/JPA

来自分类Dev

PostMapping 问题 - GetMapping 方法 - 链接中的循环。弹簧靴

来自分类Dev

如何返回外部域中的文件?(弹簧靴/ java)

来自分类Dev

确保弹簧靴和 liquibase 接收并处理 SIGTERM

来自分类Dev

布线滑移弹簧集成(4.2)

来自分类Dev

如何定制弹簧集成流程

来自分类Dev

布线滑移弹簧集成(4.2)

来自分类Dev

索偿过滤器,带角靴和弹簧靴

来自分类Dev

通过弹簧集成注释将多个通道发送到单个通道