找不到类 org.jooq.JSON 的序列化器,也没有发现用于创建 BeanSerializer 的属性

问题描述 投票:0回答:2

通过将方法实现为 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 中解决这个问题

java api rest serialization jooq
2个回答
1
投票

假设您使用的是 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


0
投票

您无法在生成的 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());
}
© www.soinside.com 2019 - 2024. All rights reserved.