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