2014-09-20 48 views
1

我在相同的問題上發現了很多答案,但仍然沒有人對我有用:(我已經厭倦了從我身邊的誤解。我通過@RequestBody將JSON字符串傳遞給Spring控制器,並獲得「400 Bad Request」響應。當我使用@ModelAttribute時 - 一切正常,但所有值都爲空在將JSON數據傳遞給Spring控制器時仍然收到錯誤的請求

我使用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":"[email protected]"} 

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> 

請讓我知道你是否需要其他信息。欣賞你的答案!

UPDATE:

打開日誌春天是 「全部」(在log4j.properties放線:log4j.category.org.springframework = ALL)後,我發現了問題:春天無法解析日期我希望它解析的價值。

+4

如果你把你的春天日誌調試,春天會告訴你什麼是錯的。 – 2014-09-20 16:49:04

+0

設置「log4j.category.org.springframework = ALL」對我來說非常有用,thx。 – Paul 2016-04-15 09:00:10

回答

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; 
} 
+0

你的答案幫助了我,謝謝。 – Paul 2016-04-14 22:58:22

相關問題