我在同样的问题上找到了很多答案,但仍然没有人对我有用:(我觉得已经厌倦了我身边的误解。问题很明显:我通过@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值。
答案 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;
}