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

时间:2018-10-08 10:46:20

标签: java json spring-boot http-post mapping

我有不同的职位请求正文,如下所示:

{
   "name": "US",  
   "amount": "1234"    
}

{
   "fullName": "US",  
   "transAmount": "1234"    
}

我创建了一个Java过滤器来修改我的Spring Boot应用程序中的那些请求主体。我想将它们转换为统一格式,以使所有请求正文都可以映射到同一POJO。

最终,“名称”和“全名”保留被映射为名称, “金额”和“ transAmount”应映射为金额。我该如何实现?

我已经有了答案:

@JsonAlias({"name", "fullName"})
private String name; 

但是我想使用配置文件来实现。然后只需更改配置文件,即可添加/删除映射值。如何使用配置文件执行同一操作?

1 个答案:

答案 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);
    }
}