Spring 如何从“展开自定义序列化对象”;内容“;带Jackon&;弹簧靴

Spring 如何从“展开自定义序列化对象”;内容“;带Jackon&;弹簧靴,spring,spring-boot,jackson,jackson-databind,Spring,Spring Boot,Jackson,Jackson Databind,我自定义序列化了由此类表示的对象: public class Product { private Long id; private String name; private Unit defaultUnit; private Section section; } 序列化: @Override public void serialize(Product product, JsonGenerator jsonGenerator, SerializerProvider

我自定义序列化了由此类表示的对象:

public class Product {
    private Long id;
    private String name;
    private Unit defaultUnit;
    private Section section;
}
序列化:

@Override
public void serialize(Product product, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
    jsonGenerator.writeNumberField("id", product.getId());
    jsonGenerator.writeStringField("name", product.getName());
    jsonGenerator.writeStringField("defaultUnit", product.getDefaultUnit().toString());
    jsonGenerator.writeObjectField("section", product.getSection());
}
但是,这会产生一个错误,据我所知,这意味着默认序列化程序创建了一个键,我必须为它提供一个值:

Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not write a field name, expecting a value; nested exception is com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value]
现在很明显,解决方案是包装字段

    jsonGenerator.writeStartObject();
    jsonGenerator.writeEndObject();
但是,这会导致生成包装在“内容”对象中的实体:

我的问题是,是否可以编写没有“content”键的未包装实体

以下是与产品相关的所有代码: Product.java

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@JsonDeserialize(using = ProductDeserializer.class)
@JsonSerialize(using = ProductSerializer.class)
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NonNull
    private String name;

    @ManyToOne
    @NonNull
    private Unit defaultUnit;

    @ManyToOne
    @NonNull
    private Section section;
}
ProductExtrapt.java

@Projection(name = "productExcerpt", types = {Product.class})
public interface ProductExcerpt {
    String getName();
    @Value("#{target.defaultUnit.toString()}")
    String getDefaultUnit();
    SectionExcerpt getSection();
}
ProductRepository.java

@RepositoryRestResource(excerptProjection = ProductExcerpt.class)
@CrossOrigin
public interface ProductRepository extends JpaRepository<Product, Long> {
}
@RepositoryRestResource(节选投影=产品节选.class)
@交叉起源
公共接口ProductRepository扩展了JpaRepository{
}
ProductSerializer.java

public class ProductSerializer extends StdSerializer<Product> {

    ProductSerializer(){
        super(Product.class);
    }

    @Override
    public void serialize(Product product, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeNumberField("id", product.getId());
        jsonGenerator.writeStringField("name", product.getName());
        jsonGenerator.writeStringField("defaultUnit", product.getDefaultUnit().toString());
        jsonGenerator.writeObjectField("section", product.getSection());
        jsonGenerator.writeEndObject();
    }
}
公共类ProductSerializer扩展了StdSerializer{
ProductSerializer(){
超级(产品类);
}
@凌驾
public void serialize(产品产品、JsonGenerator JsonGenerator、SerializerProvider SerializerProvider)引发IOException{
jsongGenerator.writeStartObject();
jsongGenerator.WriteEnumberField(“id”,product.getId());
jsonGenerator.writeStringField(“name”,product.getName());
jsonGenerator.writeStringField(“defaultUnit”,product.getDefaultUnit().toString());
jsongGenerator.WriteObject字段(“section”,product.getSection());
jsongGenerator.writeEndObject();
}
}

还有ProductDeserializer类,但我认为在这种情况下它是不可逆的。我没有配置控制器,因为就我而言,使用spring data rest时不需要控制器。

它与自定义serialiser无关。可能是序列化包装器对象,而不是直接序列化
Product
对象。你能展示一下你是如何序列化对象的吗?几乎没有更多的发现了。
serialize
方法位于扩展了
StdSerializer
ProductSerializer
类中,因此我非常确定这是一个产品序列化器类(如果我错了,请纠正我)。它还与
Product
类中的
@JsonSerialize
注释一起使用。除此之外,这里只有
ProductReposiroty
repository,但由于这里没有自定义登录,我想这不会影响所描述的问题。您能给我们看一下与您的问题相关的控制器、服务、存储库代码吗?我发布了所有与产品相关的代码。这里没有控制器,因为就我而言,在使用sprinddatarest时不需要定义一个,我在没有springdatajpa的情况下尝试过,直接使用ObjectMapper序列化<代码>产品串行化刚刚好-不带“内容”展开。是否有其他您认为在问题中未提及的配置?尝试使用关键字“content”搜索项目。
public class ProductSerializer extends StdSerializer<Product> {

    ProductSerializer(){
        super(Product.class);
    }

    @Override
    public void serialize(Product product, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeNumberField("id", product.getId());
        jsonGenerator.writeStringField("name", product.getName());
        jsonGenerator.writeStringField("defaultUnit", product.getDefaultUnit().toString());
        jsonGenerator.writeObjectField("section", product.getSection());
        jsonGenerator.writeEndObject();
    }
}