如何在Java Spring启动应用程序中使用Web Client将Spring Bean序列化为REST调用的主体?&



我需要定期使用相同的参数从应用程序属性中提取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)....

作为一种解决方法,我尝试在类中创建Configuration Bean的静态非Bean副本,复制字段值并使用该静态实例。

这工作,但我不确定如果这可以被认为是一个解决方案或只是一个hack!我可以看到的缺点是,有时需要添加属性时,有人可能会忘记编辑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;
}
}

相关内容

  • 没有找到相关文章

最新更新