Gửi phản đối JSON trống đến API

Oct 08 2020

Đối với mục đích phòng thí nghiệm, tôi phải gửi một đối tượng JSON chứa các đối tượng khác và một trong số chúng không có thuộc tính (trống) như bạn có thể thấy:

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

Tôi đang sử dụng Java Jersey và POJO để tạo các lớp Java từ tải trọng JSON nhưng tôi không thể tìm thấy nội dung gửi trong trường hợp này phù hợp với yêu cầu API của tôi.

Đây là mẫu mã của tôi:

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

Đây là lỗi do không thể tuần tự hóa Đối tượng Hồ sơ vì nó không có thuộc tính:

jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Không tìm thấy bộ tuần tự nào cho lớp Payload.Api.Apps.Post.Assign.Request.Profile và không có thuộc tính nào được phát hiện để tạo BeanSerializer (để tránh ngoại lệ, tắt SerializationFeature.FAIL_ON_EMPTY_BEANS) (thông qua chuỗi tham chiếu: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profile"])

Cảm ơn !

Trả lời

2 PaulSamsotha Oct 08 2020 at 23:12

Lỗi đang cho bạn biết để vô hiệu hóa thuộc SerializationFeature.FAIL_ON_EMPTY_BEANStính trên ObjectMapper. Thông thường để cấu hình ObjectMappervới Jersey, bạn sẽ thực hiện một ContextResolver. Jackson ObjectMapperđược sử dụng dưới mui xe sẽ tìm kiếm trình phân giải này và cấu hình thuộc tính.

Nhưng trong trường hợp này, bạn đã sử dụng trình ánh xạ trong mã của mình. Vì vậy, tôi sẽ chỉ định cấu hình trình ánh xạ đó và sau đó tuần tự hóa Userđối tượng thành một Chuỗi và sử dụng chuỗi JSON đó làm thực thể

objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

Sau đó, ở cuối trước mã khách hàng của bạn chỉ cần tuần tự hóa Userchuỗi thành một chuỗi.

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

Trong các trường hợp khác, nếu bạn chưa có ObjectMapper, bạn sẽ thực hiện một ContextResolvernhư tôi đã đề cập ở trên.

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;
    }
}

Sau đó, bạn sẽ đăng ký điều này với khách hàng

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

Bạn đã tạo đối tượng Credentials () và đây là một đối tượng trống nhưng bạn đã thiết lập userName, bây giờ không trống. Đối tượng thông tin xác thực có một biến userName. Nhưng đối tượng Profile () đã tạo của bạn trống. Và bạn đã không đặt bất kỳ biến nào cho đối tượng Hồ sơ () này . Bạn setted hồ sơ () đối tượng để trống hồ sơ () đối tượng. Bạn cần đặt một biến thực.