Отправить пустой объект JSON в API
Для лабораторных целей я должен отправить объект JSON, содержащий другие объекты, и один из них не имеет свойства (пусто), как вы можете видеть:
{
"id": "00u12e3knx76B4PNS4x7",
"scope": "USER",
"credentials": {
"userName": "[email protected]"
},
"profile": {}
}
Я использую Java Jersey и POJO для создания классов Java из полезных данных JSON, но я не могу найти, что отправить в этом случае, соответствующее моим требованиям API.
Вот мой пример кода:
@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();
Вот ошибка из-за невозможности сериализации объекта профиля, потому что он не имеет свойств:
jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: не найден сериализатор для класса Payload.Api.Apps.Post.Assign.Request.Profile и не обнаружены свойства для создания BeanSerializer (чтобы избежать исключения, отключить SerializationFeature.FAIL_ON_EMPTY_BEANS) (через цепочку ссылок: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["профиль"])
Спасибо !
Ответы
Ошибка говорит вам отключить SerializationFeature.FAIL_ON_EMPTY_BEANSсвойство в ObjectMapper. Обычно для настройки с ObjectMapperпомощью Джерси вы реализуете ContextResolver. Джексон, ObjectMapperкоторый используется под капотом, будет искать этот преобразователь и настраивать свойство.
Но в этом случае вы уже используете картограф в своем коде. Поэтому я бы просто настроил этот сопоставитель, а затем сериализовал бы Userобъект в строку и использовал бы эту строку JSON в качестве объекта
objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
Затем внизу перед клиентским кодом просто сериализуйте Userего в строку.
String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
...
.post(Entity.entity(userJson, MediaType.APPLICATION_JSON));
В других случаях, если у вас еще нет ObjectMapper, вы можете реализовать, ContextResolverкак я упоминал выше.
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;
}
}
Затем вы должны зарегистрировать это у клиента
Response postResponse = ClientBuilder.newClient()
.register(ObjectMapperResolver.class)
...
Вы создали объект Credentials (), и это пустой объект, но вы установили userName, теперь он не пустой. У объекта учетных данных есть переменная userName. Но созданный вами объект Profile () пуст. И вы не устанавливали никаких переменных для этого объекта Profile () . Вы установили объект Profile () на пустой объект Profile () . Вам нужно установить реальную переменную.