Enviar un objeto JSON vacío a la API
Para fines de laboratorio, tengo que enviar un objeto JSON que contiene otros objetos y uno de ellos no tiene propiedad (vacío) como puede ver:
{
"id": "00u12e3knx76B4PNS4x7",
"scope": "USER",
"credentials": {
"userName": "[email protected]"
},
"profile": {}
}
Estoy usando Java Jersey y POJO para generar clases Java a partir de cargas útiles JSON, pero no puedo encontrar qué enviar en este caso que coincida con mi requisito de API.
Aquí está mi ejemplo 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();
Aquí está el error debido a la imposibilidad de serializar el objeto de perfil porque no tiene propiedades:
jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No se encontró ningún serializador para la clase Payload.Api.Apps.Post.Assign.Request.Profile y no se descubrieron propiedades para crear BeanSerializer (para evitar excepciones, deshabilitar SerializationFeature.FAIL_ON_EMPTY_BEANS) (a través de la cadena de referencia: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["perfil"])
Gracias !
Respuestas
El error le indica que desactive la SerializationFeature.FAIL_ON_EMPTY_BEANSpropiedad en el ObjectMapper. Normalmente, para configurar ObjectMappercon Jersey, implementaría un ContextResolver. El Jackson ObjectMapperque se usa debajo del capó buscaría este resolutor y configuraría la propiedad.
Pero en este caso, ya está utilizando un asignador en su código. Así que simplemente configuraría ese asignador y luego serializaría el Userobjeto en una Cadena y usaría esa cadena JSON como entidad
objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
Luego, en la parte inferior, antes de su código de cliente, simplemente serialice el Useren una cadena.
String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
...
.post(Entity.entity(userJson, MediaType.APPLICATION_JSON));
En otros casos, si aún no tiene un ObjectMapper, lo implementaría ContextResolvercomo mencioné anteriormente.
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;
}
}
Entonces registraría esto con el cliente
Response postResponse = ClientBuilder.newClient()
.register(ObjectMapperResolver.class)
...
Creó el objeto Credentials () y este es un objeto vacío, pero estableció el nombre de usuario, ahora no está vacío. El objeto Credentials tiene una variable userName. Pero su objeto Profile () creado está vacío. Y no estableció ninguna variable para este objeto Profile () . Usted setted Perfil () objeto de vaciar Perfil () del objeto. Necesita establecer una variable real.