Envoyer un objet JSON vide à l'API

Oct 08 2020

À des fins de laboratoire, je dois envoyer un objet JSON contenant d'autres objets et l'un d'eux n'a pas de propriété (vide) comme vous pouvez le voir:

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

J'utilise Java Jersey et POJO pour générer des classes Java à partir de charges utiles JSON, mais je ne trouve pas ce que je dois envoyer dans ce cas qui correspond à mon exigence d'API.

Voici mon exemple de code:

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

Voici l'erreur due à l'impossibilité de sérialiser l'objet de profil car il n'a pas de propriétés:

jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: aucun sérialiseur trouvé pour la classe Payload.Api.Apps.Post.Assign.Request.Profile et aucune propriété découverte pour créer BeanSerializer (pour éviter une exception, désactiver SerializationFeature.FAIL_ON_EMPTY_BEANS) (via la chaîne de référence: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profil"])

Merci !

Réponses

2 PaulSamsotha Oct 08 2020 at 23:12

L'erreur vous indique de désactiver la SerializationFeature.FAIL_ON_EMPTY_BEANSpropriété sur le ObjectMapper. Normalement, pour configurer le ObjectMapperavec Jersey, vous implémentez un fichier ContextResolver. Le Jackson ObjectMapperqui est utilisé sous le capot chercherait ce résolveur et configurerait la propriété.

Mais dans ce cas, vous utilisez déjà un mappeur dans votre code. Je voudrais donc simplement configurer ce mappeur, puis sérialiser l' Userobjet en une chaîne et utiliser cette chaîne JSON comme entité

objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

Ensuite, en bas avant votre code client, sérialisez simplement le Useren une chaîne.

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

Dans d'autres cas, si vous n'aviez pas déjà un ObjectMapper, vous implémenteriez un ContextResolvercomme je l'ai mentionné ci-dessus.

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

Ensuite, vous enregistrez cela avec le client

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

Vous avez créé l' objet Credentials () et il s'agit d'un objet vide mais vous avez défini userName, il n'est pas vide. L'objet Credentials a une variable userName. Mais votre objet Profile () créé est vide. Et vous n'avez défini aucune variable pour cet objet Profile () . Vous setted Profil () objet vide Profil () objet. Vous devez définir une vraie variable.