2013-03-11 3 views
0

У меня есть модель, как:Как указать определенный Сериализатор для объекта?

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

В моих шаблонах, я хотел бы, чтобы сделать более простую версию этой модели, только идентификатор и имя.

Если я сделаю Json.toJson(SomeModel.find.findList());, он отобразит список SomeModels в базе данных, но с полной формой.

Я написал сериализатор, который просто возвращает id и имя, но как я могу сообщить 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(); 
    } 

} 

Я посмотрел на код в игре, и, конечно же, toJson простая версия, которая не принимает некоторые сериалайзер в качестве параметра, поэтому я предполагаю, что я должен написать длинный код, но я не знаю, что/как это сделать.

Код в игре Json.toJson:

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()); 

Благодарим за помощь!

ответ

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()); 

надеюсь, что это помогает :)

Смежные вопросы