ส่ง JSON objet เปล่าไปยัง API

Oct 08 2020

เพื่อวัตถุประสงค์ในห้องปฏิบัติการฉันต้องส่งวัตถุ JSON ที่มีวัตถุอื่นและหนึ่งในนั้นไม่มีคุณสมบัติ (ว่างเปล่า) อย่างที่คุณเห็น:

{
     "id": "00u12e3knx76B4PNS4x7",
     "scope": "USER",
     "credentials": {
     "userName": "[email protected]"
     },
     "profile": {}
}

ฉันใช้ Java Jersey และ POJO เพื่อสร้างคลาส Java จากเพย์โหลด JSON แต่ฉันไม่พบสิ่งที่จะส่งในกรณีนี้ที่ตรงกับข้อกำหนด API ของฉัน

นี่คือตัวอย่างโค้ดของฉัน:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response eventHook(String body, @HeaderParam("Pass") String password) {
    ObjectMapper objectMapper = new ObjectMapper();
    RequestPayload requestPayload = new RequestPayload();

    writeLogger(body);

    try {
        requestPayload = objectMapper.readValue(body, RequestPayload.class);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }

    EventsItem event = requestPayload.getData().getEvents().get(0);

    TargetItem targetItem = event.getTarget().get(2);

    RequestApiAssignUser user = new RequestApiAssignUser();

    Credentials credentials = new Credentials();
    credentials.setUserName("id");
    user.setId(getUser.getId());
    user.setScope("USER");
    user.setCredentials(credentials);

    Profile profile = new Profile();
    user.setProfile(profile);

    Response postResponse = ClientBuilder.newClient()
            .target(API_URL)
            .path("apps/" + getApps("0oa13t5dqnkYGDZEd4x7") + "/users")
            .request(MediaType.APPLICATION_JSON)
            .header(HttpHeaders.AUTHORIZATION, "SSWS " + API_TOKEN)
            .post(Entity.entity(user, MediaType.APPLICATION_JSON));

    String responseAPI = postResponse.readEntity(String.class);

    return Response.status(200).entity(responseAPI).build();

นี่คือข้อผิดพลาดเนื่องจากความเป็นไปไม่ได้ที่จะทำให้เป็นซีเรียลไลซ์วัตถุโปรไฟล์เนื่องจากไม่มีคุณสมบัติ:

jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: ไม่พบ serializer สำหรับคลาส Payload.Api.Apps.Post.Assign.Request.Profile และไม่พบคุณสมบัติในการสร้าง BeanSerializer (เพื่อหลีกเลี่ยงข้อยกเว้น ปิดการใช้งาน SerializationFeature.FAIL_ON_EMPTY_BEANS) (ผ่านห่วงโซ่อ้างอิง: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profile"])

ขอบคุณ!

คำตอบ

2 PaulSamsotha Oct 08 2020 at 23:12

ข้อผิดพลาดกำลังบอกให้คุณปิดใช้งานSerializationFeature.FAIL_ON_EMPTY_BEANSคุณสมบัติบนไฟล์ObjectMapper. โดยปกติในการกำหนดค่าObjectMapperด้วย Jersey คุณจะต้องใช้ไฟล์ContextResolver. แจ็คสันObjectMapperที่ใช้ภายใต้ประทุนจะดูตัวแก้ไขนี้และกำหนดค่าคุณสมบัติ

แต่ในกรณีนี้คุณใช้เครื่องมือทำแผนที่ในโค้ดของคุณอยู่แล้ว ดังนั้นฉันจะกำหนดค่า mapper นั้นแล้วทำให้Userวัตถุเป็นอนุกรมเป็นสตริงและใช้สตริง JSON นั้นเป็นเอนทิตี

objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

จากนั้นที่ด้านล่างก่อนโค้ดไคลเอ็นต์ของคุณเพียงแค่ทำให้อนุกรมUserเป็นสตริง

String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
            ...
            .post(Entity.entity(userJson, MediaType.APPLICATION_JSON));

ในกรณีอื่น ๆ หากคุณยังไม่มีObjectMapperคุณจะต้องดำเนินการContextResolverตามที่ฉันกล่าวไว้ข้างต้น

public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper = new ObjectMapper();

    public ObjectMapperResolver() {
        mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
    }

    @Override
    public ObjectMapper getContext(Class<?> cls) {
        return mapper;
    }
}

จากนั้นคุณจะลงทะเบียนกับลูกค้า

Response postResponse = ClientBuilder.newClient()
        .register(ObjectMapperResolver.class)
        ...
Emefar Oct 08 2020 at 22:03

คุณสร้างวัตถุข้อมูลประจำตัว ()และนี่เป็นวัตถุว่างเปล่า แต่คุณตั้งชื่อผู้ใช้ไว้ตอนนี้ไม่ว่างเปล่า ออบเจ็กต์ Credentials มีตัวแปร userName แต่วัตถุProfile () ที่คุณสร้างขึ้นว่างเปล่า และคุณไม่ได้ตั้งค่าตัวแปรใด ๆ ให้กับออบเจ็กต์Profile ()นี้ คุณตั้งค่าวัตถุProfile () เป็นวัตถุProfile ()ว่างเปล่า คุณต้องตั้งค่าตัวแปรจริง