Senden Sie ein leeres JSON-Objekt an die API
Für Laborzwecke muss ich ein JSON-Objekt senden, das andere Objekte enthält, und eines davon hat keine Eigenschaft (leer), wie Sie sehen können:
{
"id": "00u12e3knx76B4PNS4x7",
"scope": "USER",
"credentials": {
"userName": "[email protected]"
},
"profile": {}
}
Ich verwende Java Jersey und POJO, um Java-Klassen aus JSON-Nutzdaten zu generieren, kann jedoch nicht finden, was in diesem Fall an meine API-Anforderungen gesendet werden soll.
Hier ist mein Codebeispiel:
@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();
Hier ist der Fehler aufgrund der Unmöglichkeit, das Profilobjekt zu serialisieren, da es keine Eigenschaften hat:
jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Für die Klasse Payload.Api.Apps.Post.Assign.Request.Profile wurde kein Serializer gefunden, und es wurden keine Eigenschaften zum Erstellen von BeanSerializer gefunden (um Ausnahmen zu vermeiden). Deaktivieren Sie SerializationFeature.FAIL_ON_EMPTY_BEANS) (über die Referenzkette: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profile"])
Vielen Dank !
Antworten
Der Fehler weist Sie an, die SerializationFeature.FAIL_ON_EMPTY_BEANSEigenschaft auf der zu deaktivieren ObjectMapper. Normalerweise würden Sie zum Konfigurieren von ObjectMappermit Jersey a implementieren ContextResolver. Der Jackson ObjectMapper, der unter der Haube verwendet wird, würde diesen Resolver nachschlagen und die Eigenschaft konfigurieren.
In diesem Fall verwenden Sie jedoch bereits einen Mapper in Ihrem Code. Also würde ich einfach diesen Mapper konfigurieren und dann das UserObjekt in einen String serialisieren und diesen JSON-String als Entität verwenden
objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
Dann serialisieren Sie unten vor Ihrem Client-Code einfach die UserZeichenfolge.
String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
...
.post(Entity.entity(userJson, MediaType.APPLICATION_JSON));
In anderen Fällen würden Sie, wenn Sie noch keine hatten, eine ObjectMapperimplementieren, ContextResolverwie oben erwähnt.
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;
}
}
Dann würden Sie dies beim Kunden registrieren
Response postResponse = ClientBuilder.newClient()
.register(ObjectMapperResolver.class)
...
Sie haben das Objekt Credentials () erstellt und dies ist ein leeres Objekt, aber Sie haben den Benutzernamen festgelegt, der jetzt nicht leer ist. Anmeldeinformationsobjekt haben eine userName-Variable. Ihr erstelltes Profile () -Objekt ist jedoch leer. Und Sie haben keine Variable für dieses Profile () -Objekt festgelegt. Sie haben das Profile () - Objekt auf ein leeres Profile () - Objekt gesetzt. Sie müssen eine echte Variable setzen.