在将JSON数据传递给Spring控制器时仍然收到错误请求

时间:2014-09-20 16:43:27

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

我在同样的问题上找到了很多答案,但仍然没有人对我有用:(我觉得已经厌倦了我身边的误解。问题很明显:我通过@RequestBody将JSON字符串传递给Spring控制器get" 400 Bad Request" response。当我使用@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>

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

更新

将春天的原木变为&#34; All&#34; (在log4j.properties中放行:log4j.category.org.springframework = ALL)我发现了问题:Spring无法解析我希望它解析的Date值。

1 个答案:

答案 0 :(得分:4)

您似乎获得了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;
}