JAX-RS @Produces: как настроить JSON?

Я новичок в JAX-RS и хочу использовать свой список элементов в формате JSON. Моя модель сущности выглядит примерно так:

public class Entity {
    private String name;
    private Date date;
    private Float number;
}

Вот как я вызываю службу:

@Path("/entities")
public class EntitiesController {
    @GET
    @Produces({"application/json"})
    public List<Entity> getEntities() {
        return EntityDAO.entitiesList();
    }
}

Однако дата не форматируется, а отображается как длинное.

Этот ответ показывает, как отформатировать дату используя JsonSerializer. Если я расширим JsonSerializer, то куда мне поместить этот подкласс в моем проекте?


person dabadaba    schedule 15.10.2015    source источник
comment
Как вы думаете, почему это происходит из-за того, что атрибут не определен? Jaxrs должен просто сериализовать его в json, используя null.   -  person Cory Klein    schedule 15.10.2015
comment
Кроме того, для форматирования даты, пожалуйста, разделите его на отдельный вопрос. (Вы также можете найти это полезным.)   -  person Cory Klein    schedule 15.10.2015
comment
@CoryKlein Я обнаружил, что геттер для number возвращал float вместо Float, вот что вызывало ошибку. Во всяком случае, меня больше интересует настройка JSON, как следует из названия.   -  person dabadaba    schedule 15.10.2015
comment
@CoryKlein Я видел подобные решения, но, поскольку я новичок, я не знаю, где разместить класс, наследуемый от JsonSerializer, чтобы собрать все вместе.   -  person dabadaba    schedule 15.10.2015
comment
Я обновил ваш вопрос, чтобы более точно отразить то, что я считаю вашим намерением. Пожалуйста, не стесняйтесь вернуться, если вы чувствуете, что это не отражает вашего реального намерения задать этот вопрос.   -  person Cory Klein    schedule 15.10.2015
comment
@CoryKlein, наконец, понял это. Создал пакет serializers, создал в нем CustomJsonDateSerializer, импортировал его в свой класс Entity и добавил следующую аннотацию в поле date: @JsonSerialize(using = CustomJsonDateSerializer.class) Я приму ваш ответ   -  person dabadaba    schedule 15.10.2015
comment
Еще лучше, ответьте на вопрос самостоятельно, используя поле ниже!   -  person Cory Klein    schedule 15.10.2015


Ответы (1)


Я сам придумал решение:

В новом пакете serializers я создал класс CustomJsonDateSerializer, которому будет делегирована ответственность за форматирование атрибута date благодаря аннотации @JsonSerialize(...).

Поэтому я изменил свой класс Entity, добавив эту аннотацию поверх поля:

@JsonSerialize(using = CustomJsonDateSerializer.class)
private Date date;

А это содержимое CustomJsonDateSerializer:

package serializers;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class CustomJsonDateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonGenerationException {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyy");
        String format = formatter.format(value);
        jgen.writeString(format);
    }
}
person dabadaba    schedule 16.10.2015