【问题标题】:Still getting Bad Request while passing JSON data to Spring controller将 JSON 数据传递给 Spring 控制器时仍然收到错误请求
【发布时间】:2014-11-15 01:27:45
【问题描述】:

我在同样的问题上找到了很多答案,但仍然没有一个对我有用:(而且我已经厌倦了我的误解。问题很清楚:我通过 @RequestBody 将 JSON 字符串传递给 Spring 控制器和得到“400 Bad Request”响应。当我使用@ModelAttribute - 一切正常,但所有值都是空的。

我正在使用 POSTman 发送请求。这是代码:

控制器:

@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody User createUser(@RequestBody User user) {
logger.info("UserController -> createUser call made");
    if (user != null) {
        logger.info("UserController -> createUser(" + user.toString() + ")");
    } else {
        logger.info("UserController -> createUser(null)");
    }
    user.setCreatedDate(new Date());
    return userService.createUser(user);
}

实体类:

@Entity
@Table(name = "users")
@XmlRootElement
public class User implements Serializable {

@Id
@GeneratedValue
private int id;

private String firstName;

private String lastName;

@Transient
private String name;

private String email;

/*
 * 1 - male
 * 0 - female
 */
private boolean gender;

private Date createdDate;

@JsonSerialize(using = DateSerializer.class)
public Date getCreatedDate() {
    return createdDate;
}

public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

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

public boolean getGender() {
    return gender;
}

public void setGender(boolean gender) {
    this.gender = gender;
}

public String getName() {
    return name;
}

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

@Override
public String toString() {
    return getFirstName() + " " +
           getLastName() + ", " +
           (getGender() ? "male, " : "female, ") +
           getEmail() + ", id = " + getId() +
           " created on: [" + getCreatedDate() + "]";
}

JSON 已通过:

{"gender":true,"lastName":"Novosad","firstName":"Oleg","createdDate":"Sat Sep 20 16:16:48 EEST 2014","email":"adminnovik@gmail.com"}

Headers: Content-Type:application/json

配置:

<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="text/xml" />
        </map>
    </property>
    <property name="defaultContentType" value="text/html" />
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
        </list>
    </property>
</bean>

如果您需要其他信息,请告诉我。感谢您的回答!

更新:

将 spring 的日志设置为“All”后(在 log4j.properties 中放置行:log4j.category.org.springframework=ALL)我发现了问题:Spring 无法解析我希望它解析的日期值。

【问题讨论】:

  • 如果你把你的 Spring 日志转为 debug,Spring 会告诉你哪里出了问题。
  • 设置“log4j.category.org.springframework=ALL”对我来说非常有用,谢谢。

标签: java json spring spring-mvc bad-request


【解决方案1】:

您似乎获得了 400,因为您的 MappingJackson2HttpMessageConverter 及其 ObjectMapper 无法反序列化您提供的日期。

最简单的解决方案是提供使用您的日期格式的自定义日期反序列化器。

class CustomDateDeserializer extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
        try {
            return format.parse(jp.getText());
        } catch (ParseException e) {
            throw new RuntimeException(e); // or handle any other way you like
        }
    }
}

@JsonSerialize(using = DateSerializer.class)
@JsonDeserialize(using = CustomDateDeserializer.class)
public Date getCreatedDate() {
    return createdDate;
}

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多