JAX-RS @Produces: bagaimana cara menyesuaikan JSON?

Saya baru mengenal JAX-RS dan saya ingin menyajikan daftar item saya sebagai JSON. Model entitas saya kira-kira seperti ini:

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

Inilah cara saya menjalankan layanan:

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

Namun, tanggalnya tidak diformat namun ditampilkan sebagai panjang.

Jawaban ini menunjukkan cara memformat tanggal menggunakan JsonSerializer. Jika saya memperpanjang JsonSerializer, lalu di mana saya meletakkan subkelas itu di proyek saya?


person dabadaba    schedule 15.10.2015    source sumber
comment
Menurut Anda mengapa hal ini terjadi karena suatu atribut tidak ditentukan? Jaxrs harus membuat cerita bersambung ke json menggunakan null.   -  person Cory Klein    schedule 15.10.2015
comment
Juga, untuk format tanggal harap bagi menjadi pertanyaannya sendiri. (Anda mungkin juga menganggap ini bermanfaat.)   -  person Cory Klein    schedule 15.10.2015
comment
@CoryKlein Saya menemukan pengambil untuk number mengembalikan float bukannya Float, itulah yang menyebabkan kesalahan. Bagaimanapun, saya lebih tertarik pada kustomisasi JSON seperti judulnya.   -  person dabadaba    schedule 15.10.2015
comment
@CoryKlein Saya telah melihat solusi serupa, tetapi karena saya baru, saya tidak tahu di mana harus menempatkan kelas yang diwarisi dari JsonSerializer untuk menyatukan semuanya.   -  person dabadaba    schedule 15.10.2015
comment
Saya memperbarui pertanyaan Anda agar lebih akurat mencerminkan apa yang saya anggap sebagai niat Anda. Silakan kembali jika Anda merasa itu tidak mencerminkan niat Anda yang sebenarnya dalam menanyakan pertanyaan ini.   -  person Cory Klein    schedule 15.10.2015
comment
@CoryKlein akhirnya menemukan jawabannya. Membuat paket serializers, membuat CustomJsonDateSerializer di dalamnya, mengimpornya ke kelas Entity saya dan menambahkan anotasi berikut ke bidang date saya: @JsonSerialize(using = CustomJsonDateSerializer.class) Saya akan menerima jawaban Anda   -  person dabadaba    schedule 15.10.2015
comment
Lebih baik lagi, jawab sendiri pertanyaannya menggunakan kotak di bawah ini!   -  person Cory Klein    schedule 15.10.2015


Jawaban (1)


Saya sendiri menemukan solusinya:

Di bawah paket serializers baru saya membuat kelas CustomJsonDateSerializer, yang akan didelegasikan tanggung jawab memformat atribut date berkat anotasi @JsonSerialize(...).

Jadi saya memodifikasi kelas Entity saya dengan menambahkan anotasi itu di atas bidang:

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

Dan ini isi 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