Enviar objeto JSON vazio para API

Oct 08 2020

Para fins de laboratório, tenho que enviar um objeto JSON contendo outros objetos e um deles não tem propriedade (vazio) como você pode ver:

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

Estou usando Java Jersey e POJO para gerar classes Java a partir de cargas JSON, mas não consigo encontrar o que enviar neste caso corresponde ao meu requisito de API.

Aqui está meu exemplo de código:

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

Aqui está o erro devido à impossibilidade de serializar o Objeto de Perfil porque ele não possui propriedades:

jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Nenhum serializador encontrado para a classe Payload.Api.Apps.Post.Assign.Request.Profile e nenhuma propriedade descoberta para criar BeanSerializer (para evitar exceção, desativar SerializationFeature.FAIL_ON_EMPTY_BEANS) (por meio da cadeia de referência: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["perfil"])

Obrigado !

Respostas

2 PaulSamsotha Oct 08 2020 at 23:12

O erro está avisando para desativar a SerializationFeature.FAIL_ON_EMPTY_BEANSpropriedade no ObjectMapper. Normalmente, para configurar o ObjectMappercom Jersey, você implementaria a ContextResolver. O Jackson ObjectMapperusado nos bastidores procuraria esse resolvedor e configuraria a propriedade.

Mas, neste caso, você já está usando um mapeador em seu código. Então, eu apenas configuraria esse mapeador e, em seguida, serializaria o Userobjeto em uma String e usaria essa string JSON como a entidade

objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

Então, na parte inferior, antes do código do cliente, serialize o Userem uma string.

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

Em outros casos, se ainda não tiver um ObjectMapper, você deve implementar um ContextResolvercomo mencionei acima.

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

Então você registraria isso com o cliente

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

Você criou o objeto Credentials () e este é um objeto vazio, mas você definiu userName, agora não está vazio. O objeto Credentials possui uma variável userName. Mas o objeto Profile () criado está vazio. E você não definiu nenhuma variável para este objeto Profile () . Você definiu o objeto Profile () para o objeto Profile () vazio . Você precisa definir uma variável real.