无法从BeanPostProcessor中的占位符获取值

阿基米德·图拉真(Archimedes Trajan)

我将Spring与Spring Boot BOM 2.4.0随附的旧版Tomcat应用程序(而非Spring Boot)一起使用,问题类似于无法使用Spring Expression Language的问题,但我有特定情况。

如果我有一个与@Value("${spring.kafka.maximumRequestSize:15728640}")以下相关的类

@Configuration
@Order
public class KafkaTracingDecorator implements  ApplicationContextAware {
    private KafkaTracing kafkaTracing;

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {

        kafkaTracing = applicationContext.getBean(KafkaTracing.class);
    }
}

有用。以下内容也可以,但是在后处理器上我什么也不做

@Configuration
@Order
public class KafkaTracingDecorator implements BeanPostProcessor, ApplicationContextAware {

    @Override
    public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {

        return bean;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {

//        kafkaTracing = applicationContext.getBean(KafkaTracing.class);
    }
}

但是,当我尝试实行BeanPostProcessor实现Decorator模式是这样

@Configuration
@Order
public class KafkaTracingDecorator implements BeanPostProcessor, ApplicationContextAware {

    private KafkaTracing kafkaTracing;

    @Override
    public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {

        if (bean instanceof KafkaProducer) {
            return kafkaTracing.producer((KafkaProducer) bean);
        } else if (bean instanceof KafkaConsumer) {
            return kafkaTracing.consumer((KafkaConsumer) bean);
        } else {
            return bean;
        }
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {

        kafkaTracing = applicationContext.getBean(KafkaTracing.class);
    }
}

Caused by: java.lang.NumberFormatException: For input string: "${spring.kafka.maximumRequestSize:15728640}"在创建WebApplicationContext时得到

即使我不使用该值,也不会发生这种情况,也会发生这种情况

@Configuration
@Order
public class KafkaTracingDecorator implements BeanPostProcessor, ApplicationContextAware {

    private KafkaTracing kafkaTracing;

    @Override
    public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {

        return bean;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {

        kafkaTracing = applicationContext.getBean(KafkaTracing.class);
    }
}

这是一个非常简化的示例,同样失败了:

@Configuration
public class KafkaTracingDecorator implements BeanPostProcessor {

    @Value("${spring.kafka.maximumRequestSize:15728640}")
    private int maxRequestSize;

}

(请注意,这在Spring Boot上可以正常工作,因此可能与Spring的非启动用法有关)

导致错误的部分堆栈跟踪未列出任何自定义代码:

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:270)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:761)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:566)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4689)

MVCE已添加:https : //github.com/trajano/spring-beanpostproc-mvce链接到GitHub问题,以防它是一个错误https://github.com/spring-projects/spring-framework/issues/26571而不是使用问题。

安妮丝·B。

您需要Decorator通过注册PropertySourcesPlaceholderConfigurerBean来更新类,以解决您的问题。

根据PropertyPlaceholderConfigurer上的Spring Docs

PropertyPlaceholderConfigurerPlaceholderConfigurerSupport的子类该子类有助于${...}根据本地属性和/或系统属性以及环境变量来解析占位符。

因此,配置此bean将从类路径中加载application.properties,它将能够解析${..}@Value批注中使用的值以获取实际值集。

更新了装饰器类:

@Configuration
public class Decorator implements BeanPostProcessor {
    
    @Value("${spring.kafka.maximumRequestSize}")
    private int maxRequestSize;
    
    @Bean
    public static PlaceholderConfigurerSupport placeholderConfigurerSupport() {
        PlaceholderConfigurerSupport support = new PropertySourcesPlaceholderConfigurer();
        support.setLocations(new ClassPathResource("application.properties"));
        return support;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(maxRequestSize);
        return bean;
    }
}

application.properties

spring.kafka.maximumRequestSize=15728640

AdoptedOpenJDK 11.0.6上运行Tomcat 8.5.57的控制台日志

...
.....
INFO: Initializing Spring root WebApplicationContext
Feb 20, 2021 9:21:41 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
15728640
Feb 20, 2021 9:21:41 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext initialized in 518 ms
Feb 20, 2021 9:21:41 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Feb 20, 2021 9:21:41 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1419 ms

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法从BeanPostProcessor中的占位符获取值

来自分类Dev

F#FAKE-无法获取FAKE来合并.nuspec文件中的占位符参数

来自分类Dev

无法解析占位符| 春季占位符

来自分类Dev

我如何使用python和selenium获取值不是utf-8的占位符的值?

来自分类Dev

无法从python中的字典中获取值

来自分类Dev

HTML中的占位符与数据占位符

来自分类Dev

无法从PHP中的不同字段获取值

来自分类Dev

为什么无法从ArrayList中获取值?

来自分类Dev

无法通过JavaScript从输入中获取值

来自分类Dev

无法从PHP中的不同字段获取值

来自分类Dev

无法从allHeaderFields字典中获取值

来自分类Dev

无法从“指令”范围中获取值

来自分类Dev

无法从Groovy中的yml文件获取值

来自分类Dev

无法从数组中获取值 (c)

来自分类Dev

无法使用 jQuery 从标签中获取值

来自分类Dev

无法从 PHP 中的 DateTime 对象获取值

来自分类Dev

无法从复选框中获取值

来自分类Dev

无法从 groovy 中的 Map 获取值

来自分类Dev

无法从 materializecss MultiSelect 中获取值

来自分类Dev

无法从集合中获取值(使用 GetElementsByClassName)

来自分类Dev

无法使用 attr() 从 div 中获取值

来自分类Dev

无法从 GET 请求中获取值

来自分类Dev

无法从多维数组中获取值

来自分类Dev

如何使用CSS在占位符中获取星号

来自分类Dev

获取在占位符中动态生成的文本框的值

来自分类Dev

cakephp中的占位符

来自分类Dev

R中的占位符

来自分类Dev

SQL中的占位符

来自分类Dev

“ replaceAll”中的占位符