Wie Sie eine Liste der Objekte im Play Framework

Hier mein test-setup:

Modell:

package models;

    import javax.persistence.Entity;
    import play.db.jpa.Model;

    @Entity
    public class Item extends Model {

        public String propertyA;
        public String propertyB;

        public String getFullName() {
            return this.propertyA + " - " + this.propertyB;
        }
    }

Die Steuerung:

package controllers;

import play.*;
import play.mvc.*;

import java.util.*;

import models.*;

public class Application extends Controller {

    public static void index() {
        List<Item> allItems = Item.findAll();
        render(allItems);
    }

    public static void save(List<Item> items) {
        if (items == null) {
            Logger.info("no items");
        } else {
            for (Item item : items) {
                Logger.info("item: %s",item);
            }
            Logger.info("-------");
        }
        index();
    }
}

Der Ansicht:

#{extends 'main.html' /}
#{set title:'Home' /}
#{form @Application.save()}

Select Items:
<div>
    <select name="items" style="width: 200px;" multiple="multiple" size="10">
        #{list items:allItems, as: 'item'}
        <option value=${item.id} >${item.fullName}</option>
        #{/list}
    </select>
</div> 
<input type="submit" value="Save" />
#{/form}

Wenn ich wählen Sie zwei Elemente in der Select-box, ich bekomme folgende Log-Ausgabe:

06:22:20,560 INFO  ~ -------
06:22:26,991 INFO  ~ item: null
06:22:26,991 INFO  ~ item: null

Sieht es aus wie spielen Karten, die Auswahl auf eine Liste von null Objekte. Auch wenn ich die Ansicht ändern:

<option value=${item} >${item.fullName}</option>

Bekomme ich null Werte.

Aber wenn ich den controller an:

public static void save(List<Long> items) {
...
}

Ich zumindest eine Liste der korrekten Ids.

Wie kann ich dies ändern, so dass spielen schafft die richtige Zuordnung für meine Artikel. Ich mir lieber List<Item> statt List<Long> (hier habe ich Abfragen ausführen um wieder die Liste der Artikel).

BR, Rene

Update:

Wenn ich laufen:

curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save

Wich nicht einen BEITRAG mit der oben genannten Parameter, den ich bekommen:

A02:39:53,072 INFO  ~ item: bla - blo
02:39:53,072 INFO  ~ item: null - null
02:39:53,072 INFO  ~ -------

Wie das funktioniert, aber ich sehe nicht, wie könnte ich die Ansicht ändern, so dass es Beiträge, die die oben genannten Parameter 🙁

Update 2:

Mit der Hilfe von Felipe ich es geschafft habe. Dieser Controller-Methode Hinzugefügt werden:

@Before(only = {"save"})
static void parseParams() {
    String[] items = params.getAll("items");
    params.remove("items");
    for (int i = 0; i < items.length; i++) {
        Item item = Item.findById(Long.parseLong(items[i]));
        params.put("items[" + i + "].id", items[i]);
        params.put("items[" + i + "].propertyA", item.propertyA);
        params.put("items[" + i + "].propertyB", item.propertyB);
    }
}
  • Es gibt einen Weg, es zu tun mit @interceptor Vor... ich update meine Antwort..
InformationsquelleAutor reen | 2011-09-14
Schreibe einen Kommentar