将空 JSON 对象发送到 API
Send empty JSON objet to API
出于实验目的,我必须发送一个包含其他对象的 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: No
serializer found for class
Payload.Api.Apps.Post.Assign.Request.Profile and no properties
discovered to create BeanSerializer (to avoid exception, disable
SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain:
Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser["profile"])
谢谢!
您创建了 Credentials() 对象,这是一个空对象,但您设置了 userName,现在不为空。 Credentials 对象有一个 userName 变量。但是您创建的 Profile() 对象是空的。而且您没有为此 Profile() 对象设置任何变量。您将 Profile() 对象设置为空 Profile() 对象。你需要设置一个真正的变量。
错误提示您禁用 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)
...
出于实验目的,我必须发送一个包含其他对象的 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: No serializer found for class Payload.Api.Apps.Post.Assign.Request.Profile and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: Payload.Api.Apps.Post.Assign.Request.RequestApiAssignUser["profile"])
谢谢!
您创建了 Credentials() 对象,这是一个空对象,但您设置了 userName,现在不为空。 Credentials 对象有一个 userName 变量。但是您创建的 Profile() 对象是空的。而且您没有为此 Profile() 对象设置任何变量。您将 Profile() 对象设置为空 Profile() 对象。你需要设置一个真正的变量。
错误提示您禁用 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)
...