2015-09-20 31 views
1

我一直在试图将我的android多形式数据绑定到播放框架表单绑定。但现在它似乎在抱怨日期格式绑定失败。任何帮助将非常感激!绑定Android Retrofit多部分数据到播放框架

我目前从Android应用程序发送了格式为 “YYYY-MM-DD”

的事情,如果曾尝试:

  • 试图设置我自己日期格式在“application.conf”为 date.format = yyyy-MM-dd
  • 试图手动设置java.util.Date格式。

    val format = new java.text.SimpleDateFormat("yyyy-MM-dd") 
        format.format(new java.util.Date()) 
    

这里是HTTP数据映射i。从Android的改型接收。我做了一个println的 “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!") 
    } 

Android Retrofit接口代码:

@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) { 

       } 
      }); 
+0

试试这个https://github.com/square/retrofit/issues/291。此链接已帮助我解决日期问题。给出的链接只是提示。 – Tauqir

+0

非常感谢链接!我会尝试:) – Jone45

+0

传感数据在纪元 – Haito

回答

0

我结束了以下Haito建议将日期转换为划时代的长值,并将其发送过来玩的框架。 所以现在检索后日期价值从播放框架我将需要将其转换回日期并做我自己的格式。

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) { 

         } 
        }); 

其实我挖出日期格式和分析功能,并尝试对其进行修改。但我想我对scala还是比较新的,并且无法实现它。

我发现有一件事很奇怪,就是def dateParse(data:String)函数。如果我传递值“2015-09-02”,它将起作用。但是,如果从它的函数参数中获取值,它将起作用。我在“data”参数上做了一个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))) 
}