首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Android改造多部分数据绑定到Play框架

将Android改造多部分数据绑定到Play框架
EN

Stack Overflow用户
提问于 2015-09-20 03:54:05
回答 1查看 462关注 0票数 1

我一直试图将我的android多格式数据绑定到play框架表单绑定。但是现在,它似乎在抱怨日期格式绑定失败了。任何帮助都是非常感谢的!

我目前从android应用程序发送的格式是“yyyy dd”。

尝试过的Things:

  • 尝试将“date.format=yyyy-MM-dd”中的日期格式设置为application.conf
  • 尝试手动设置java.util.Date格式。 val =新java.text.SimpleDateFormat(“yyyy”)format.format(新java.util.Date())

这里是我从Android改造中接收到的Http数据映射。我在"request.body.dataParts“上做了个打印

代码语言:javascript
运行
复制
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))

错误消息播放框架正在抱怨:

代码语言:javascript
运行
复制
Binding Failed
List(FormError(date,error.date,List()))

播放框架控制器代码:

代码语言:javascript
运行
复制
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!")
  }

安卓改造接口代码:

代码语言:javascript
运行
复制
@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:

代码语言:javascript
运行
复制
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) {

                }
            });
EN

回答 1

Stack Overflow用户

发布于 2015-09-21 03:02:24

最后,我按照海托的建议,将日期转换为划时代的长值,并将其发送到play框架中。所以现在,在从play框架中检索 Date 值之后,我需要将它转换回日期并进行自己的格式化。

代码语言:javascript
运行
复制
val datetime = new Date(1442802362000L)

更新的播放框架代码:

代码语言:javascript
运行
复制
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片段代码:

代码语言:javascript
运行
复制
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“,但我只是不工作。

代码语言:javascript
运行
复制
// 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函数的代码:

代码语言:javascript
运行
复制
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)))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32675631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档