API'ye boş JSON objet gönder

Oct 08 2020

Laboratuvar amacıyla, diğer nesneleri içeren bir JSON nesnesi göndermem gerekiyor ve görebileceğiniz gibi bunlardan birinin özelliği yok (boş):

{
     "id": "00u12e3knx76B4PNS4x7",
     "scope": "USER",
     "credentials": {
     "userName": "[email protected]"
     },
     "profile": {}
}

JSON yüklerinden Java sınıfları oluşturmak için Java Jersey ve POJO kullanıyorum, ancak bu durumda ne göndereceğimi API gereksinimlerime uygun bulamıyorum.

İşte kod örneğim:

@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();

Profil Nesnesinin hiçbir özelliği olmadığı için serileştirmenin imkansızlığından kaynaklanan hata:

jakarta.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Payload.Api.Apps.Post.Assign.Request.Profile sınıfı için serileştirici bulunamadı ve BeanSerializer oluşturmak için hiçbir özellik keşfedilmedi (istisnayı önlemek için, SerializationFeature.FAIL_ON_EMPTY_BEANS) devre dışı bırakın (referans zinciri aracılığıyla: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser ["profil"])

Teşekkürler !

Yanıtlar

2 PaulSamsotha Oct 08 2020 at 23:12

Hata, SerializationFeature.FAIL_ON_EMPTY_BEANSüzerindeki özelliği devre dışı bırakmanızı söylüyor ObjectMapper. Normalde ObjectMapperJersey ile yapılandırmak için bir ContextResolver. ObjectMapperKaputun altında kullanılan Jackson , bu çözümleyiciye bakar ve mülkü yapılandırır.

Ancak bu durumda, kodunuzda zaten bir eşleyici kullanıyorsunuz. Bu yüzden, bu eşleyiciyi yapılandırır ve ardından Usernesneyi bir String olarak dizgeleştirir ve bu JSON dizesini varlık olarak kullanırdım.

objectMapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

Ardından, istemci kodunuzdan önce alt kısımda, sadece Userbir dizeye serileştirin .

String userJson = objectMapper.writeValueAsString(user);
Response postResponse = ClientBuilder.newClient()
            ...
            .post(Entity.entity(userJson, MediaType.APPLICATION_JSON));

Diğer durumlarda, önceden bir tane ObjectMapperyoksa, ContextResolveryukarıda bahsettiğim gibi bir uygularsınız .

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;
    }
}

O zaman bunu müşteriye kaydedersiniz

Response postResponse = ClientBuilder.newClient()
        .register(ObjectMapperResolver.class)
        ...
Emefar Oct 08 2020 at 22:03

Credentials () nesnesini oluşturdunuz ve bu boş bir nesnedir ancak userName'i ayarladınız, şimdi boş değil. Credentials nesnesinin bir userName değişkeni var. Ancak oluşturduğunuz Profil () nesneniz boş. Ve bu Profile () nesnesine herhangi bir değişken ayarlamadınız . Sen setted Profili () boş nesneyi Profil () nesne. Gerçek bir değişken belirlemeniz gerekir.