如何使用配置文件将多个不同的请求正文映射到同一个 POJO



>我有不同的后请求正文,如下所示:

{
"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);
}
}

最新更新