通过将方法实现为 API 服务,我遇到了这个问题
找不到类 org.jooq.JSON 的序列化程序,也没有属性 发现创建 BeanSerializer (为了避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过引用链: java.util.ArrayList[0]-> db.jooq.tables.pojos.Query["queryJson"])
我的查询(表)的 Jooq POJO 是:
private Integer id;
private JSON queryJson;
给出查询列表作为响应的方法是
@Produces(MediaType.APPLICATION_JSON) public Response
getQueries(@PathParam("ownerId") String ownerId,
@PathParam("roomId") String hotelroom) throws JsonProcessingException {
List<Query> queries = DatabaseUtil.getQueries(dsl, UUID.fromString(hotelroom));
return Response.ok(queries).build();}
但是没有序列化,如果我将 jooq POJO 更改为这样:
private Integer id;
private String queryJson;
那么我的响应的输出将不会通过序列化而出现错误。 有谁知道如何在 jooq 中解决这个问题
假设您使用的是 Jackson,您可以使用
JSON
注释您的
JsonRawValue
属性:
private Integer id;
@JsonRawValue
private JSON queryJson;
如果您还需要从 JSON 读取值,您可以这样做:
private Integer id;
@JsonRawValue
@JsonDeserialize(using = JSONDeserializer.class)
private JSON queryJson;
...与:
class JSONDeserializer extends JsonDeserializer<JSON> {
@Override
public JSON deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
Object t = p.readValueAsTree();
return t == null ? null : JSON.json("" + t);
}
}
未来的 jOOQ 版本(尚未 3.16)可能会在代码生成器中为此类注释提供本机支持:https://github.com/jOOQ/jOOQ/issues/13333
您无法在生成的 JOOQ 源中注释字段,因为自定义注释将在下一次代码生成期间被覆盖。
在寻找答案时,我发现了这篇博文。
总而言之,您需要创建一个自定义序列化器,让 Jackson 了解如何序列化
org.jooq.JSON
对象。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.jooq.JSON;
import java.io.IOException;
public class JooqJsonSerializer extends StdSerializer<JSON> {
public JooqJsonSerializer() {
super(JSON.class);
}
@Override
public void serialize(JSON value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeRawValue(value.data());
}
}
然后通过在您应该已经拥有的任何 Spring
@Configuration
类中添加配置方法来配置 Jackson 以使用它。
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder ->
builder.serializationInclusion(JsonInclude.Include.USE_DEFAULTS)
.serializers(new JooqJsonSerializer());
}