Как отобразить несколько разных тел запросов в один и тот же POJO с помощью файла конфигурации - PullRequest
0 голосов
/ 08 октября 2018

У меня есть разные тела запросов после отправки, такие как:

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

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

Я создал фильтр Java для изменения этих тел запросов в моем приложении для весенней загрузки.Я хочу преобразовать их в единый формат, чтобы все тела запросов могли быть сопоставлены с одним и тем же POJO.

В конечном счете, «name» и «fullName» должны быть сопоставлены с name, «amount» и«transAmount» должен быть сопоставлен с количеством.Как мне этого добиться?

У меня уже есть ответ:

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

Но я хочу добиться этого с помощью файла конфигурации.Затем, просто изменив файл конфигурации, я могу добавить / удалить значения сопоставления.Как я могу сделать то же самое, используя файл конфигурации?

1 Ответ

0 голосов
/ 08 октября 2018

Возможное решение.(Я уверен, что могут быть и другие)

Я думаю, вам нужно переопределить поведение по умолчанию 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);
    }
}
...