如何在Java Sping Boot 应用程序中使用Web客户端发送序列化为REST调用主体的Spring Bean?

yacmzcpb  于 2022-12-17  发布在  Spring
关注(0)|答案(1)|浏览(92)

我需要定期调用REST,每次都使用相同的参数,从应用程序属性中提取。为了避免每次都创建请求对象,我想使用配置Bean作为请求主体,它将被序列化为JSON。
配置bean如下所示:

@ConfigurationProperties(prefix = "myprefix")
@Configuration("configname")
@Getter
@Setter
public class ConfigDetails {

    private String c1;

    private String c2;

    private String c3;
}

我将这个bean注入到调用带有@Autowired注解的REST API的类中。在进行REST调用时,在序列化期间,我得到以下错误:

No serializer found for class org.springframework.context.expression.StandardBeanExpressionResolver and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.ril.scm.node.data.PromiseEngineLoginDetails$$EnhancerBySpringCGLIB$$cad0a6e6["$$beanFactory"]->org.springframework.beans.factory.support.DefaultListableBeanFactory["beanExpressionResolver"])

我正在使用WebClient进行如下调用:

webClient.post().body(Mono.just(configDetails), ConfigDetails.class)....
wa7juj8i

wa7juj8i1#

作为一种解决方法,我尝试在类内部创建配置Bean的静态非bean副本,复制字段值并使用该静态示例。
这起作用了,但我不确定这是否可以被认为是一个解决方案或只是一个黑客!我可以看到的缺点是,有时需要添加属性时,有人可能会忘记编辑init()方法。

@ConfigurationProperties(prefix = "myprefix")
@Configuration("configname")
@Getter
@Setter
public class ConfigDetails {

    private String c1;

    private String c2;

    private String c3;

    private static ConfigDetails staticConfigDetails;

    @PostConstruct
    public void init(){
        staticConfigDetails = new ConfigDetails();
        staticConfigDetails.setC1(this.c1);
        ...
        //set other properties
        ....
        
    }

    public static ConfigDetails getInstance(){
        return staticConfigDetails;
    }
}

相关问题