Kirim objek JSON kosong ke API
Untuk keperluan lab saya harus mengirim objek JSON yang berisi objek lain dan salah satunya tidak memiliki properti (kosong) seperti yang Anda lihat:
{
"id": "00u12e3knx76B4PNS4x7",
"scope": "USER",
"credentials": {
"userName": "[email protected]"
},
"profile": {}
}
Saya menggunakan Java Jersey dan POJO untuk menghasilkan kelas Java dari muatan JSON tetapi saya tidak dapat menemukan apa yang akan dikirim dalam kasus ini yang sesuai dengan persyaratan API saya.
Ini contoh kode saya:
@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();
Berikut adalah kesalahan karena ketidakmungkinan untuk membuat Objek Profil berseri karena tidak memiliki properti:
jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Tidak ditemukan serializer untuk kelas Payload.Api.Apps.Post.Assign.Request.Profile dan tidak ada properti yang ditemukan untuk membuat BeanSerializer (untuk menghindari pengecualian, nonaktifkan SerializationFeature.FAIL_ON_EMPTY_BEANS) (melalui rantai referensi: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profile"])
Terima kasih!
Jawaban
Kesalahan memberitahu Anda untuk menonaktifkan SerializationFeature.FAIL_ON_EMPTY_BEANSproperti di ObjectMapper. Biasanya untuk mengkonfigurasi ObjectMapperdengan Jersey, Anda akan menerapkan file ContextResolver. Jackson ObjectMapperyang digunakan di bawah tenda akan mencari resolver ini dan mengkonfigurasi properti.
Namun dalam kasus ini, Anda sudah menggunakan mapper dalam kode Anda. Jadi saya hanya akan mengkonfigurasi mapper itu dan kemudian membuat serial Userobjek menjadi String dan menggunakan string JSON itu sebagai entitas
objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
Kemudian di bagian bawah sebelum kode klien Anda hanya membuat serial Userke string.
String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
...
.post(Entity.entity(userJson, MediaType.APPLICATION_JSON));
Dalam kasus lain, jika Anda belum memiliki ObjectMapper, Anda akan menerapkan ContextResolverseperti yang saya sebutkan di atas.
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;
}
}
Kemudian Anda akan mendaftarkan ini dengan klien
Response postResponse = ClientBuilder.newClient()
.register(ObjectMapperResolver.class)
...
Anda membuat objek Credentials () dan ini adalah objek kosong tetapi Anda menyetel userName, sekarang tidak kosong. Objek Credentials memiliki variabel userName. Tetapi objek Profile () yang Anda buat kosong. Dan Anda tidak menyetel variabel apa pun ke objek Profile () ini . Anda menyetel objek Profile () ke objek Profile () kosong . Anda perlu mengatur variabel nyata.