【问题标题】:Send empty JSON objet to API向 API 发送空 JSON 对象
【发布时间】:2020-10-08 14:55:12
【问题描述】:

出于实验室目的,我必须发送一个包含其他对象的 JSON 对象,并且其中一个没有属性(空),如您所见:

{
     "id": "00u12e3knx76B4PNS4x7",
     "scope": "USER",
     "credentials": {
     "userName": "some@email.com"
     },
     "profile": {}
}

我正在使用 Java Jersey 和 POJO 从 JSON 有效负载生成 Java 类,但我找不到在这种情况下发送的内容符合我的 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["profile"])

谢谢!

【问题讨论】:

  • 能不能把Profile类的代码也加一下?
  • 它是空的,public class Profile {}
  • 你看这里给出的解决方案是否有帮助stackoverflow.com/questions/25720509/…
  • 不起作用user.setProfile(objectMapper.writeValueAsString(new Profile())); 需要一个对象而不是字符串

标签: java web-services jackson jersey


【解决方案1】:

错误告诉您禁用ObjectMapper 上的SerializationFeature.FAIL_ON_EMPTY_BEANS 属性。通常要使用 Jersey 配置 ObjectMapper,您将实现 ContextResolver。在后台使用的 Jackson 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)
        ...

【讨论】:

  • 我已经添加了这些行 user.setProfile(new Profile());String userJson = objectMapper.writeValueAsString(user); 我正在将此值发送到我的 API {"profile":{},"credentials":"userName":"jeremie@lyvoc.com"},"scope":"USER","id":"00u12e3knx76B4PNS4x7"} 这似乎没问题,但我收到错误消息请求的正文不正确
  • Nethermind,我没有正确重建我的代码,您的解决方案运行良好,谢谢!
【解决方案2】:

您创建了 Credentials() 对象,这是一个空对象,但您设置了 userName,现在不为空。 Credentials 对象有一个 userName 变量。但是您创建的 Profile() 对象是空的。而且您没有为此 Profile() 对象设置任何变量。您将 Profile() 对象设置为空 Profile() 对象。你需要设置一个实变量。

【讨论】:

  • 不,我不能为 Profile 对象设置任何变量
  • 如何将 Credentials 对象设置为 userName?您需要像 Credentials 这样的 Profile 的 getter 和 setter 方法。
  • 我不明白你的问题,我的凭证对象有一个字符串属性“userName”,它是一个 ID。我的配置文件对象没有属性,因此不能有任何 getter/setter
  • 您需要为 Profile 添加 getter 和 setter 方法。如果不是,您的 Profile 对象将为空。您需要为 Profile 设置一个变量。当您添加 getter 和 setter 方法并将变量设置为 Profile 时,您可以在 JSON 中看到所有这些。
  • 我的RequestApiAssignUser 有一个设置器:public void setProfile(Profile Profile){ this.Profile = Profile;} 但我不能让它只发送一个空对象
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2012-12-01
  • 2016-05-26
  • 2014-03-14
  • 2022-01-09
  • 2019-07-10
  • 2017-08-17
  • 1970-01-01
相关资源
最近更新 更多