我一直试图将我的android多格式数据绑定到play框架表单绑定。但是现在,它似乎在抱怨日期格式绑定失败了。任何帮助都是非常感谢的!
我目前从android应用程序发送的格式是“yyyy dd”。
尝试过的Things:
这里是我从Android改造中接收到的Http数据映射。我在"request.body.dataParts“上做了个打印
Map(stock -> List(11), productname -> List(pleasework), price -> List(11.0), userid -> List(test), brand -> List(nike), condition -> List(New (with defects)), date -> List("2015-09-20"), category -> List(Shoe), ean -> List(e0ee9583-fb10-43c1-80f3-c1725251adfc), sold -> List(true))错误消息播放框架正在抱怨:
Binding Failed
List(FormError(date,error.date,List()))播放框架控制器代码:
val format = new java.text.SimpleDateFormat("yyyy-MM-dd")
format.format(new java.util.Date())
val userForm = Form(
mapping(
"ean" -> text,
"date" -> of(dateFormat),
"sold" -> boolean,
"productname" -> text,
"userid" -> text,
"price" -> of(doubleFormat),
"stock" -> number,
"brand" -> text,
"category" -> text ,
"condition" -> text
)(Product.apply)(Product.unapply)
)
def multiuploaddata = Action(parse.multipartFormData) {
implicit request =>
userForm.bindFromRequest()(request).fold (
errFrm =>{
println("Binding Failed")
println(errFrm.errors)
},
userData => {
println("Success bind: " + userData.ean)
}
)
}
Ok("Receive MultiImage is okay!")
}安卓改造接口代码:
@Multipart
@POST("/multiuploaddata")
void updateProductImageData(@Part("ean") String ean,
@Part("date") Date date,
@Part("sold") boolean sold,
@Part("productname") String productname,
@Part("userid") String userid,
@Part("price") double price,
@Part("stock") int stock,
@Part("brand") String brand,
@Part("category") String category,
@Part("condition") String condition
, @PartMap Map<String, TypedFile> Files, Callback<Photo> callback);Android片段onClickListener:
mDoneButton = (Button) v.findViewById(R.id.done_button);
mDoneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Calling the retrofit Interface to send Data and Images over to server
service.updateProductImageData(mProduct.getId().toString(),
mProduct.getDate(), mProduct.isSold(), mProduct.getProductName(),
mProduct.getUserId(), mProduct.getPrice(), mProduct.getStock(), mProduct.getBrand(), mProduct.getCategory()[0],
mProduct.getCondition()[0], files, new retrofit.Callback<Photo>() {
@Override
public void success(Photo photo, Response response) {
Log.d(TAG, "SUCCESS UPLOAD MULTI IMAGE!!! " + response);
}
@Override
public void failure(RetrofitError error) {
}
});发布于 2015-09-21 03:02:24
最后,我按照海托的建议,将日期转换为划时代的长值,并将其发送到play框架中。所以现在,在从play框架中检索 Date 值之后,我需要将它转换回日期并进行自己的格式化。
val datetime = new Date(1442802362000L)更新的播放框架代码:
val userForm1 = Form(
mapping(
"ean" -> text,
"date" -> longNumber, <--- change to long instead of date
"sold" -> boolean,
"productname" -> text,
"userid" -> text,
"price" -> of(doubleFormat),
"stock" -> number,
"brand" -> text,
"category" -> text ,
"condition" -> text
)(Product1.apply)(Product1.unapply)
)Android片段代码:
service.updateProductImageData2(mProduct.getId().toString(),
// Convert the date value into long
mProduct.getDate().getTime(), mProduct.isSold(), mProduct.getProductName(),
mProduct.getUserId(), mProduct.getPrice(), mProduct.getStock(), mProduct.getBrand(), mProduct.getCategory()[0],
mProduct.getCondition()[0], files, new retrofit.Callback<Photo>() {
@Override
public void success(Photo photo, Response response) {
Log.d(TAG, "SUCCESS UPLOAD MULTI IMAGE!!! " + response);
}
@Override
public void failure(RetrofitError error) {
}
});实际上,我确实挖掘了DateFormat和解析函数,并试图对其进行修改。但我想我对scala还是很陌生的,无法让它开始工作。
我确实感到奇怪的是,对于def dateParse(data: String)函数。如果我传入值"2015-09-02“,它就能工作了。但是,如果从它的函数参数中提取值,它就会工作。我对“数据”参数做了一个println,它是相同的"2015-09-02“,但我只是不工作。
// This will work
def dateParse(data: String) = {formatter.parseDateTime("2015-09-02").toDate}
// This will not work
def dateParse(data: String) = {formatter.parseDateTime(data).toDate}解析和dateFormat函数的代码:
private def parsing[T](parse: String => T, errMsg: String, errArgs: Seq[Any])(key: String, data: Map[String, String]): Either[Seq[FormError], T] = {
stringFormat.bind(key, data).right.flatMap { s =>
println("The Data is: " + data("date"))
scala.util.control.Exception.allCatch[T]
.either(parse(s))
.left.map(e => Seq(FormError(key, errMsg, errArgs)))
}
}
def dateFormat(pattern: String, timeZone: TimeZone = TimeZone.getDefault): Formatter[Date] = new Formatter[Date] {
val jodaTimeZone = org.joda.time.DateTimeZone.forTimeZone(timeZone)
val formatter = org.joda.time.format.DateTimeFormat.forPattern(pattern).withZone(jodaTimeZone)
def dateParse(data: String) = {formatter.parseDateTime(data).toDate}
override val format = Some(("format.date", Seq(pattern)))
def bind(key: String, data: Map[String, String]) = parsing(dateParse, "error.date", Nil)(key, data)
def unbind(key: String, value: Date) = Map(key -> formatter.print(new org.joda.time.DateTime(value).withZone(jodaTimeZone)))
}https://stackoverflow.com/questions/32675631
复制相似问题