(播放2.1.3)@select return(String,String)对

时间:2013-09-23 02:20:51

标签: java scala playframework playframework-2.0

我在游戏2.1.3中与@select helper挣扎。

我想用一个用户列表进行简单的选择。 select应该将值设置为用户的id,该选项应该具有用户的名称。 我正在使用MongoDB模块,因此它们都是字符串。 这就是我所拥有的:

@select(createForm("userId"),
    options = User.options(),
    'class -> "form-control",
    '_default -> "--- Select ---",
        '_label -> "User assigned",
        '_showConstraints -> false
)
用户模型中的

和options():

public static Seq<java.util.Map.Entry<String,String>> options() {

    Seq<java.util.Map.Entry<String, String>> map = new Seq<java.util.Map.Entry<String,String>>();

    for (User user : User.coll.find().toArray()) {

        //seq.add(new AbstractMap.SimpleEntry<String, String>(user.id, user.name));
    }

    return map;
}

错误是:

type mismatch; found : Seq[java.util.Map.Entry[String,String]] required: Seq[(String, String)]

如何定义这样的一对字符串? (String,String),还是有一种更简单的方法可以在没有循环的情况下做到这一点?

谢谢

2 个答案:

答案 0 :(得分:2)

据我所知,Java中的(String, String)scala.Tuple2<String, String>,因此您的Seq应该看起来像Seq<Tuple2<String, String>>

您可以使用play.libs.Scala帮助程序在Java和Scala类型之间执行转换:

List<Tuple2<String, String>> values = new ArrayList<>();
for (User user : User.coll.find().toArray()) {
    values.add(Scala.Tuple("asd", "zxc"));
}
return Scala.toSeq(values);

答案 1 :(得分:0)

谢谢@serejja的回答。

我找到了获得相同结果的另一种方法,即使用选项助手,因为我喜欢尽可能少地使用scala。*包。

public static java.util.Map<String,String> options() {
    java.util.Map<String, String> map = new HashMap<String, String>();

    for (User user : User.coll.find().toArray()) {

        map.put(user.id, user.name);
    }
}

然后在scala中:

@select(createForm("userId"),
    options = options(User.options()),
    'class -> "form-control",
    '_default -> "--- Select ---",
    '_label -> "User assigned",
    '_showConstraints -> false

请注意 options = options(User.options())部分。

但是,我认为@ serejja的方式是更“原生”的Scala解决方案。所以我把他作为答案。

再次感谢你。