>我有不同的后请求正文,如下所示:
{
"name": "US",
"amount": "1234"
}
{
"fullName": "US",
"transAmount": "1234"
}
我创建了一个 java 过滤器来修改我的 spring 引导应用程序中的这些请求正文。我想将它们转换为统一的格式,以便将所有请求正文映射到同一个 POJO。
最终,"name">和"fullName"应该映射到name, "金额"和"转量"应映射到金额。我怎样才能做到这一点?
我已经有答案了:
@JsonAlias({"name", "fullName"})
private String name;
但是我想使用配置文件来实现这一点。然后只需更改配置文件,我就可以添加/删除映射值。如何使用配置文件执行相同的操作?
可能的解决方案。(我敢肯定可能有其他的(
我想您需要覆盖默认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);
}
}