我有不同的职位请求正文,如下所示:
{
"name": "US",
"amount": "1234"
}
{
"fullName": "US",
"transAmount": "1234"
}
我创建了一个Java过滤器来修改我的Spring Boot应用程序中的那些请求主体。我想将它们转换为统一格式,以使所有请求正文都可以映射到同一POJO。
最终,“名称”和“全名”保留被映射为名称, “金额”和“ transAmount”应映射为金额。我该如何实现?
我已经有了答案:
@JsonAlias({"name", "fullName"})
private String name;
但是我想使用配置文件来实现。然后只需更改配置文件,即可添加/删除映射值。如何使用配置文件执行同一操作?
答案 0 :(得分:0)
可能的解决方案。 (我确定可能会有其他选择)
我想您将需要覆盖默认的JacksonAnnotationIntrospector
行为,并以findPropertyAliases(..)
方法实现自定义逻辑。
然后可以通过ObjectMapper#setAnnotationIntrospector
调用来注册您的(自定义)内省者。
public void tryIt() throws IOException
{
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setAnnotationIntrospector(new CustomAnnotationIntrospector());
YourBean yourBean = objectMapper.readValue("{\"altField\": \"abc\"}", YourBean.class);
System.out.println(yourBean.getField());
}
static class YourBean
{
@JsonAliasConfigPath("/some/where")
private String field;
public String getField()
{
return field;
}
public void setField(String field)
{
this.field = field;
}
}
@Target({ElementType.ANNOTATION_TYPE,
ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER
})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
@interface JsonAliasConfigPath
{
String value();
}
class CustomAnnotationIntrospector extends JacksonAnnotationIntrospector
{
@Override
public List<PropertyName> findPropertyAliases(Annotated member)
{
CustomAliasConfig.JsonAliasConfigPath atConfigPath = _findAnnotation(member, CustomAliasConfig.JsonAliasConfigPath.class);
if (atConfigPath != null)
{
// here is your config file
String value = atConfigPath.value();
String setterName = member.getName();
// read&return aliases for setterName
// return youListOfAliases;
// let`s assume it turns your member should be expected as "altField"
return Arrays.asList(PropertyName.construct("altField"));
}
return super.findPropertyAliases(member);
}
}