@JsonProperty не работает для Content-Type: application / x-www-form-urlencoded

REST API принимает тип входного содержимого: application / x-www-form-urlencoded, когда он отображается на объект Java, например

 public class MyRequest {

    @JsonProperty("my_name")
    private String myName;

    @JsonProperty("my_phone")
    private String myPhone;

    //Getters and Setters of myName and myPhone.

    }

В запросе ввода формы я устанавливаю значения my_name и my_phone, но объект MyRequest имеет значения myName и myPhone как null.

Я использую Jackson-annotations 2.3 jar

Любые предложения, что может быть не так?


person Vineet Singla    schedule 04.08.2016    source источник


Ответы (2)


Недавно у меня была такая же проблема с SpringMVC и Jackson!

В Spring, когда вы явно настраиваете свою конечную точку на использование только application/x-www-form-urlencoded запросов, Spring может сериализоваться в ваши классы POJO, но не использует Jackson, потому что это не JSON.

Итак, чтобы эти аннотации Джексона работали с вашим POJO, вам необходимо:

  1. Получите ваши данные в виде карты
  2. Анализируйте карту данных с помощью ObjectMapper Джексона

В моем случае с помощью Spring я мог бы решить эту проблему с помощью следующего кода:

@RequestMapping(
        value = "/rest/sth",
        method = RequestMethod.POST
)
public ResponseEntity<String> create(@RequestBody MultiValueMap paramMap) { ... }

Когда вы удаляете атрибут "consumes" из аннотации @RequestMapping, вы должны использовать @RequestBody, иначе Spring не сможет идентифицировать вашу карту как допустимый параметр.

Вы, вероятно, заметите, что MultiValueMap - это не обычная карта. Значением каждого элемента является LinkedList, потому что данные формы http могут повторять значения, и поэтому эти значения будут добавлены в этот связанный список.

Имея это в виду, вот простой код для получения первого элемента и создания другой карты для преобразования в ваш POJO:

    HashMap<String, Object> newMap = new HashMap<>();
    Arrays.asList(new String[]{"my_name", "my_phone"})
            .forEach( k -> newMap.put(k, ((List<?>) paramMap.get(k)).get(0)));

    MyRequest myrequest = new ObjectMapper().convertValue(newMap, MyRequest.class);

Надеюсь, это поможет вам, как помогло мне :)

person Sidharta Noleto    schedule 10.09.2016

Я думаю, что очень простое решение - установить сеттер, связанный с переменными с помощью «_».

public class MyRequest {

    @JsonProperty("my_name")
    private String myName;

    @JsonProperty("my_phone")
    private String myPhone;

    //Getters and Setters of myName and myPhone.

    //Setters for application/x-www-form-urlencoded
    public void setMy_name(String name) {
        setMyName(name);
    }
    ......
}

Есть еще решения. См. ссылку. .

person Abdelhafid    schedule 19.10.2017