0

私は次のようなモデルを持っています:

SomeModel
    public Long id;
    public String name;
    public Integer age;
    public String address;
    public Profile profile;

私のテンプレートでは、このモデルのより単純なバージョンをレンダリングしたいと思います。IDと名前のみです。

私がそうJson.toJson(SomeModel.find.findList());すると、データベース内のリストがレンダリングさSomeModelsれますが、完全なフォームが表示されます。

idとnameを返すだけのシリアライザーを作成しましたが、Json.toJsonこのシリアライザーを使用するように指示するにはどうすればよいですか?

public class SimpleSomeModelSeralizer extends JsonSerializer<SomeModel> {
    @Override
    public void serialize(SomeModel someModel, JsonGenerator generator, SerializerProvider serializer) throws IOException,JsonProcessingException {
        if (someModel == null) return;

        generator.writeStartObject();

        generator.writeNumberField("id", someModel.getId());
        generator.writeStringField("name", someModel.getName());

        generator.writeEndObject();
    }

}

Playでコードを見てきましたが、もちろん、toJsonは単純なバージョンであり、パラメーターとしてシリアライザーを使用しないため、より長いコードを作成する必要があると思いますが、何をどのように行うかはわかりません。それをするために。

Json.toJsonのPlayのコード:

public static JsonNode toJson(final Object data) {
    try {
        return new ObjectMapper().valueToTree(data);
    } catch(Exception e) {
        throw new RuntimeException(e);
    }
}

このようなことは可能ですか?:

new ObjectMapper().useSerializer(SimpleSomeModelSeralizer.class).valueToTree(SomeModel.find.findList());
4

1 に答える 1

0

さて、これが私がしたことです。SomeModelクラスに、リストをJsonNodeとして返す静的メソッドを追加し、テンプレートから呼び出すだけです。

public static JsonNode findItemsAsJson() {
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule someModelModule = new SimpleModule("SomeModel", new Version(1, 0, 0, null));
    someModelModule.addSerializer(SomeModel.class, new SimpleSomeModelSeralizer());
    mapper.registerModule(someModelModule);

    return mapper.valueToTree(SomeModel.find.findList());
}

このメソッドの欠点は、ハードコードされたクエリ(SomeModel.find.findList())にバインドされていることですが、クエリであるそのメソッドにパラメータを簡単に追加できます。

public static JsonNode findItemsAsJson(Query<SomeModel> query) {
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule someModelModule = new SimpleModule("SomeModel", new Version(1, 0, 0, null));
    someModelModule.addSerializer(SomeModel.class, new SimpleSomeModelSeralizer());
    mapper.registerModule(someModelModule);

    return mapper.valueToTree(query.findList());
}

そして、あなたはそれを次のように呼びます:

SomeModel.findItemsAsJson(SomeModel.find.like("name", "B%").query());

お役に立てば幸いです:)

于 2013-03-11T12:39:11.747 に答える