兩個服務接口之間的調用,對象接收參數,傳過去json字符串明明賦值是正確的,但是相應對象接收到的屬性值就總是空。後來發現,如果javabean裏的屬性是大寫字母開頭則會出現這種問題,請求的時候,json字符串是大寫開頭,MVC在接收的時候,根據對象的setter,getter屬性認爲字段都是小寫的,所以沒辦法綁定。
規範代碼,屬性也應該是小定字母開頭。但是如果屬性改不了,那有還可以用.alibaba.fastjson,用這個json把java對象轉換爲字符串的時候,屬性會自動轉成小寫開頭。在pom.xml中引入如下代碼即可使用
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.5</version>
</dependency>
下面舉例說明:
javaBean
public class PriceConfirmRequestDTO {
private Integer HotelID;
private String CheckInDate;
private String CheckOutDate;
private String Nationality;
private Integer NumOfRooms;
private List< RoomOccupancyType > OccupancyDetails;
public Integer getHotelID() {
return HotelID;
}
public void setHotelID(Integer hotelID) {
HotelID = hotelID;
}
public String getCheckInDate() {
return CheckInDate;
}
public void setCheckInDate(String checkInDate) {
CheckInDate = checkInDate;
}
public String getCheckOutDate() {
return CheckOutDate;
}
public void setCheckOutDate(String checkOutDate) {
CheckOutDate = checkOutDate;
}
public String getNationality() {
return Nationality;
}
public void setNationality(String nationality) {
Nationality = nationality;
}
public Integer getNumOfRooms() {
return NumOfRooms;
}
public void setNumOfRooms(Integer numOfRooms) {
NumOfRooms = numOfRooms;
}
public List<RoomOccupancyType> getOccupancyDetails() {
return OccupancyDetails;
}
public void setOccupancyDetails(List<RoomOccupancyType> occupancyDetails) {
OccupancyDetails = occupancyDetails;
}
}
這個javaBean的屬性首字母都是大寫的,下而用goson把對象轉成json串的結果如下 :
PriceConfirmRequestDTO pp = new PriceConfirmRequestDTO();
pp.setRatePlanID(ratePlanCode);
pp.setHotelID(Integer.parseInt(hotelId));
pp.setCheckInDate(MyTime.dateToStrLong(checkInDateStr));
pp.setCheckOutDate(MyTime.dateToStrLong(checkOutDate));
pp.setNationality("CN");
pp.setNumOfRooms(roomNum);
pp.setOccupancyDetails(OccupancyDetails);
String ppstr = new Gson().toJson(pp);
System.out.println("#####請求url:"+url);
System.out.println("#####請求priceConfirm參數:"+ppstr);
String reuslt = HttpClientUtil.sendConnectionPost(url, ppstr);
ppstr的結果爲:
注意轉換後的首字母爲大寫
{
"RatePlanID": "9912354",
"HotelID": 656,
"CheckInDate": "2014-12-12 00:00:00",
"CheckOutDate": "2015-01-08 00:00:00",
"Nationality": "CN",
"NumOfRooms": 1,
"OccupancyDetails": [{
"RoomNum": 1,
"AdultCount": 1,
"ChildCount": 0
}, {
"ChildAgeDetails": [4],
"RoomNum": 2,
"AdultCount": 0,
"ChildCount": 1
}]
}
用alibaba.fastjson轉換如下:
PriceConfirmRequestDTO pp = new PriceConfirmRequestDTO();
pp.setRatePlanID(ratePlanCode);
pp.setHotelID(Integer.parseInt(hotelId));
pp.setCheckInDate(MyTime.dateToStrLong(checkInDateStr));
pp.setCheckOutDate(MyTime.dateToStrLong(checkOutDate));
pp.setNationality("CN");
pp.setNumOfRooms(roomNum);
pp.setOccupancyDetails(OccupancyDetails);
String ppstr = JSONObject.toJSONString(pp);
System.out.println("#####請求url:"+url);
System.out.println("#####請求priceConfirm參數:"+ppstr);
String reuslt = HttpClientUtil.sendConnectionPost(url, ppstr);
ppstr的結果爲:
注意轉換後的首字母爲小寫
{
"checkInDate": "2014-12-12 00:00:00",
"checkOutDate": "2015-01-08 00:00:00",
"currency": "SGD",
"hotelID": 656,
"nationality": "CN",
"numOfRooms": 1,
"occupancyDetails": [
{
"adultCount": 1,
"childCount": 0,
"roomNum": 1
},
{
"adultCount": 0,
"childAgeDetails": [
4
],
"childCount": 1,
"roomNum": 2
}
]
}
接收參數層
@RequestMapping("/priceConfirm")
public PriceConfirmResponse priceConfirmRequest(@RequestBody PriceConfirmRequestDTO pcr){
return ddPriceConfirm.priceConfirmRequest(pcr);
}