Java 有没有一种方法可以定制Spring Boot应用程序中JPA实体的一个特定字符串类型字段的序列化?

Java 有没有一种方法可以定制Spring Boot应用程序中JPA实体的一个特定字符串类型字段的序列化?,java,spring,spring-mvc,spring-boot,jackson,Java,Spring,Spring Mvc,Spring Boot,Jackson,我只希望对JPA实体的特定字符串类型字段进行自定义序列化。例如,名为User的实体类上名为details的字段。序列化逻辑需要访问其他一些SpringBean,因此应该将这些Bean注入其中 此JPA对象可能是序列化的根或要序列化的另一个实体的成员 所以我想我不能使用com.fasterxml.jackson.databind.annotation.JsonSerialize。如果我为类型String定义org.springframework.boot.jackson.JsonComponent

我只希望对JPA实体的特定字符串类型字段进行自定义序列化。例如,名为
User
的实体类上名为
details
的字段。序列化逻辑需要访问其他一些SpringBean,因此应该将这些Bean注入其中

此JPA对象可能是序列化的根或要序列化的另一个实体的成员

所以我想我不能使用
com.fasterxml.jackson.databind.annotation.JsonSerialize
。如果我为类型
String
定义
org.springframework.boot.jackson.JsonComponent
,它将被所有
String
字段调用,并可能对序列化性能/吞吐量产生潜在的负面影响


有解决此问题的方法吗?

这里是一个用于
字符串
字段的自定义序列化程序。在这个简单的例子中,它只是使其小写

class DetailsSerializer extends StdSerializer<String> {
    public DetailsSerializer() { this(null); }
    public DetailsSerializer(Class<String> t) { super(t); }

    @Override
    public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeString(value.toLowerCase());
    }
}

这是一个
字符串
字段的自定义序列化程序。在这个简单的例子中,它只是使其小写

class DetailsSerializer extends StdSerializer<String> {
    public DetailsSerializer() { this(null); }
    public DetailsSerializer(Class<String> t) { super(t); }

    @Override
    public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeString(value.toLowerCase());
    }
}

EntityListeners符合注入条件,您可以在侦听器中声明加载事件的回调,并将所需的任何bean传递给实体

public class MyListener {
  @Inject MyBean bean;

  @PostLoad
  public void inject(MyEntity entity) {
    entity.bean = bean;
  }
}
以及您的实体:

@Entity
@EntityListeners(MyListener.class)
public class MyEntity {
  public @Transient MyBean bean;
}

EntityListeners符合注入条件,您可以在侦听器中声明加载事件的回调,并将所需的任何bean传递给实体

public class MyListener {
  @Inject MyBean bean;

  @PostLoad
  public void inject(MyEntity entity) {
    entity.bean = bean;
  }
}
以及您的实体:

@Entity
@EntityListeners(MyListener.class)
public class MyEntity {
  public @Transient MyBean bean;
}

您可能已经用
@JsonComponent
注释了反序列化程序,这使得Jackson将其作为每个字符串的默认反序列化程序

删除该注释,并使用
@JsonDeserializer(using=MyDeserializer.class)
注释要使用该自定义反序列化程序反序列化的字段


这使得Spring只为您希望用反序列化程序反序列化的字段调用JsonDeserializer(通过Jackson,不确定它们在较低级别中如何工作)。

您可能已经用
@JsonComponent
注释了反序列化程序,这使得Jackson将其作为每个字符串的默认反序列化程序

删除该注释,并使用
@JsonDeserializer(using=MyDeserializer.class)
注释要使用该自定义反序列化程序反序列化的字段


这使得Spring只针对您希望用反序列化程序反序列化的字段调用JsonDeserializer(通过Jackson,不确定它们在较低级别如何工作)。

序列化,而不是反序列化。序列化,而不是反序列化。嗨,正如我在问题中提到的,我需要将其他Spring bean注入序列化程序(在本例中为
DetailsSerializer
)。您好,正如我在问题中提到的,我需要将其他SpringBean注入序列化程序(在本例中为
DetailsSerializer
)。