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