Invia oggetto JSON vuoto all'API
Per scopi di laboratorio devo inviare un oggetto JSON contenente altri oggetti e uno di loro non ha proprietà (vuoto) come puoi vedere:
{
"id": "00u12e3knx76B4PNS4x7",
"scope": "USER",
"credentials": {
"userName": "[email protected]"
},
"profile": {}
}
Sto usando Java Jersey e POJO per generare classi Java da payload JSON ma non riesco a trovare cosa inviare in questo caso che corrisponde ai miei requisiti API.
Ecco il mio esempio di codice:
@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();
Ecco l'errore dovuto all'impossibilità di serializzare l'oggetto profilo perché non ha proprietà:
jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: nessun serializzatore trovato per la classe Payload.Api.Apps.Post.Assign.Request.Profile e nessuna proprietà scoperta per creare BeanSerializer (per evitare eccezioni, disabilita SerializationFeature.FAIL_ON_EMPTY_BEANS) (tramite catena di riferimento: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profile"])
Grazie !
Risposte
L'errore ti dice di disabilitare la SerializationFeature.FAIL_ON_EMPTY_BEANSproprietà nel file ObjectMapper. Normalmente per configurare il ObjectMappercon Jersey, dovresti implementare un file ContextResolver. Il Jackson ObjectMapperche è usato sotto il cofano guarderebbe questo resolver e configurerebbe la proprietà.
Ma in questo caso, stai già utilizzando un mappatore nel tuo codice. Quindi configurerei semplicemente quel mapper e quindi serializzerei l' Useroggetto in una stringa e userei quella stringa JSON come entità
objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
Quindi in fondo prima del codice client serializza semplicemente il file Userin una stringa.
String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
...
.post(Entity.entity(userJson, MediaType.APPLICATION_JSON));
In altri casi, se non avessi già un ObjectMapper, implementeresti un ContextResolvercome ho detto sopra.
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;
}
}
Quindi lo registrerai con il cliente
Response postResponse = ClientBuilder.newClient()
.register(ObjectMapperResolver.class)
...
Hai creato l' oggetto Credentials () e questo è un oggetto vuoto ma hai impostato userName, ora non è vuoto. L'oggetto Credentials ha una variabile userName. Ma l' oggetto Profile () creato è vuoto. E non hai impostato alcuna variabile su questo oggetto Profile () . È setted Profilo) ( oggetto da vuoto Profile () dell'oggetto. Devi impostare una variabile reale.