У меня есть служба Spring MVC с этой подписью:

@RequestMapping(method = RequestMethod.POST, value = "/addUser", consumes = "application/json")
    public @ResponseBody User addUser(@RequestBody User user) {

И это в context.xml

<bean id="jacksonMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter" />
            </list>
        </property>
    </bean>

Я делаю почтовый запрос и всегда возвращаю мне 400error-> Bad request. Я пишу фильтр для чтения содержимого запроса и вот такой:

Отредактируйте json:

{
    "email": "Anchor",
    "latitude": 40.3139461,
    "longitude": -3.8810229,
    "name": "a",
    "online": true,
    "password": "a",
    "deviceRegId": "APA91bGnD1EuqEm9cpoHsenC-HEphQJRniEnhPovK24QkKkLBXrDesSCP6CFlyOKwR1huwSI28Wd-DdN0N8MDKle7myYB7Dznzc3Z11ZOv3jMlJEIegykpnnnYScrElw2czQEa4pKFeQW7BklUsUS-IB15LMqH_Ag"
}

Изменить: класс пользователя

public class User implements Serializable{


@JsonProperty("deviceRegId")
private java.lang.String deviceRegistrationID;
@JsonProperty("email")
private java.lang.String email;
@JsonProperty("latitude")
private java.lang.Double latitude;
@JsonProperty("longitude")
private java.lang.Double longitude;
@JsonProperty("name")
private java.lang.String name;
@JsonProperty("online")
private java.lang.Boolean online;
@JsonProperty("password")
private java.lang.String password;

public User(String deviceRegid) {
    this.deviceRegistrationID = deviceRegid;
    this.online = true;
}

public java.lang.String getDeviceRegistrationID() {
    return deviceRegistrationID;
}

public java.lang.String getEmail() {
    return email;
}

public void setEmail(java.lang.String email) {
    this.email = email;
}

public java.lang.Double getLatitude() {
    return latitude;
}

public void setLatitude(java.lang.Double latitude) {
    this.latitude = latitude;
}

public java.lang.Double getLongitude() {
    return longitude;
}

public void setLongitude(java.lang.Double longitude) {
    this.longitude = longitude;
}

public java.lang.String getName() {
    return name;
}

public void setName(java.lang.String name) {
    this.name = name;
}

public java.lang.Boolean getOnline() {
    return online;
}

public void setOnline(java.lang.Boolean online) {
    this.online = online;
}

/**
 * @return value or {@code null} for none
 */
public java.lang.String getPassword() {
    return password;
}

/**
 * @param password
 *            password or {@code null} for none
 */
public void setPassword(java.lang.String password) {
    this.password = password;
}

В чем проблема?

10
colymore 28 Фев 2014 в 22:08

3 ответа

Лучший ответ

Удалите параметризованный конструктор и готово. :)

public User(String deviceRegid) {
  this.deviceRegistrationID = deviceRegid;
  this.online = true;
}

Потому что при привязке данных вызывается конструктор по умолчанию.

Проверьте свои данные json:

{
  "email": "Anchor",
  "latitude": 40.3139461,
  "longitude": -3.8810229,
  "name": "a",
  "online": true,
  "password": "a",
   "deviceRegId": "APA91bGnD1EuqEm9cpoHsenC-HEphQJRniEnhPovK24QkKkLBXrDesSCP6CFlyOKwR1huwSI28Wd-DdN0N8MDKle7myYB7Dznzc3Z11ZOv3jMlJEIegykpnnnYScrElw2czQEa4pKFeQW7BklUsUS-IB15LMqH_Ag"
}

Проверьте следующее:

  1. Соответствует ли имя JSON имени поля класса User.

  2. Также проверьте, поддерживается ли значение JSON соответствующим именем поля тип данных в классе User.

    Попробуйте, я много раз сталкивался с одной и той же проблемой.

24
Community 20 Июн 2020 в 09:12

Я собирался предположить, что проблема в consumes = "application/json", и, возможно, так оно и есть ... но я провел быстрый тест, добавив это ограничение в свою среду (которое не указывает, что оно отправляет "application/json"),

И вместо этого я получил «415 неподдерживаемый тип носителя».

Тем не менее, я рекомендую удалить это и посмотреть, поможет ли это.

0
Brian T. 28 Фев 2014 в 18:51

У меня тоже была плохая просьба. А иногда плохой синтаксис и т. Д. Но я исправил это с помощью другой зависимости Джексона:

Вместо Codehause Jackson я использую теперь fastxml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.3.3</version>
</dependency>
0
Eruvanos 6 Май 2014 в 11:53