Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jackson反序列化,2个字段自引用同一类(自引用循环)_Java_Spring_Jackson_Self Reference - Fatal编程技术网

Java jackson反序列化,2个字段自引用同一类(自引用循环)

Java jackson反序列化,2个字段自引用同一类(自引用循环),java,spring,jackson,self-reference,Java,Spring,Jackson,Self Reference,我有以下引用自身的类: @Entity @Inheritance(strategy = TABLE_PER_CLASS) //@JsonIdentityInfo(property="rowId", generator = ObjectIdGenerators.PropertyGenerator.class) public abstract class AbstractEntity implements Serializable { /** * */ priv

我有以下引用自身的类:

@Entity
@Inheritance(strategy = TABLE_PER_CLASS)
//@JsonIdentityInfo(property="rowId", generator = ObjectIdGenerators.PropertyGenerator.class)
public abstract class AbstractEntity implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 568799551343430329L;

    @OneToOne(optional=false, fetch=FetchType.EAGER)
    @JoinColumn(name="createdBy")
    protected User createdBy;
    @OneToOne(optional=false, fetch=FetchType.EAGER)
    @JoinColumn(name="lastUpdatedBy")
    protected User lastUpdatedBy;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(unique = true, nullable = false, updatable = false, length = 7)
    private Integer rowId;

    public User getCreatedBy() {
        return this.createdBy;
    }

    public void setCreatedBy(User createdBy) {
        this.createdBy = createdBy;
    }

    public User getLastUpdatedBy() {
        return this.lastUpdatedBy;
    }

    public void setLastUpdatedBy(User lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    public Integer getRowId() {
        return this.rowId;
    }

    public void setRowId(Integer RowId) {
        this.rowId = RowId;
    }

    public String toString() {
        return "[Id]:" + this.rowId + " - [CreatedBy]:" + this.createdBy;
    }
}
然后我有一个类
User
扩展这个类和一个RepositoryUser界面:

public interface RepositoryUser extends CrudRepository<User, Integer> {

}
public interface RepositoryUser扩展了crudepository{
}
以及控制器:

@Controller
@RequestMapping(path = "/user")
public class ServiceUser {
    @Autowired
    private RepositoryUser repositoryUser;

    @GetMapping(path="/all", produces = "application/json; charset=UTF-8", headers = "Accept=application/json")
    public @ResponseBody Iterable<User> getAllUsers() {
        return repositoryUser.findAll();
    }

    @PostMapping(path="/add", consumes="application/json")
    public @ResponseBody User createOneUser(@RequestBody User user) {
        System.out.println(user);
        return repositoryUser.save(user);
    }
}
@控制器
@请求映射(路径=“/user”)
公共类服务用户{
@自动连线
私有RepositoryUser RepositoryUser;
@GetMapping(path=“/all”,products=“application/json;charset=UTF-8”,headers=“Accept=application/json”)
public@ResponseBody Iterable getAllUsers(){
返回repositoryUser.findAll();
}
@PostMapping(path=“/add”,consumes=“application/json”)
public@ResponseBody用户createOneUser(@RequestBody用户){
System.out.println(用户);
返回repositoryUser.save(用户);
}
}
我的问题是,我在同一个类中两次引用用户(createdby和lastupdatedby),或者我尝试了JSonIdentityInfo、Jsonmanaged和jsonback,但都不起作用。没错

我需要能够 { 用户1数据,包括创建人和上次更新人 用户2数据,包括创建人和上次更新人 }

当我添加时,我需要设置创建记录的用户

你能帮帮我吗


非常感谢

您可以使用StdSerializer编写/尝试自定义序列化程序

CustomJsonSerializer的示例。注意:没有运行代码

public class CustomJsonSerializer extends StdSerializer<AbstractEntity> {

  public CustomJsonSerializer() {
    this(null);
  }

  public CustomJsonSerializer(Class<AbstractEntity> t) {
    super(t);
  }

  @Override
  public void serialize(AbstractEntity value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
    Field[] fields = value.getClass().getDeclaredFields();
    jgen.writeStartObject();

    for (Field field : fields) {
        field.setAccessible(true);

       try {
           // Do the proper field mapping for field types . Object type example
           jgen.writeObjectField(field.getName(), field.get(value));

        } catch (Exception e) {
          // catch error
        }
    }

    jgen.writeEndObject();
  }
}
public类CustomJsonSerializer扩展了StdSerializer和

可能的不同解决方案

您可以使用StdSerializer编写/尝试自定义序列化程序

CustomJsonSerializer的示例。注意:没有运行代码

public class CustomJsonSerializer extends StdSerializer<AbstractEntity> {

  public CustomJsonSerializer() {
    this(null);
  }

  public CustomJsonSerializer(Class<AbstractEntity> t) {
    super(t);
  }

  @Override
  public void serialize(AbstractEntity value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
    Field[] fields = value.getClass().getDeclaredFields();
    jgen.writeStartObject();

    for (Field field : fields) {
        field.setAccessible(true);

       try {
           // Do the proper field mapping for field types . Object type example
           jgen.writeObjectField(field.getName(), field.get(value));

        } catch (Exception e) {
          // catch error
        }
    }

    jgen.writeEndObject();
  }
}
public类CustomJsonSerializer扩展了StdSerializer和

可能的不同解决方案

一种方法是。另一种方法是编写自己的序列化程序,扩展StdSerializerOne。另一种方法是编写自己的序列化程序扩展STDSerializer谢谢!这是一种魅力!仅供参考,我使用公共类UserSerializer扩展JsonSerializer而不是StdSerializer。@GrooveRage很高兴能提供帮助。谢谢tinus!这是一种魅力!仅供参考,我使用公共类UserSerializer扩展JsonSerializer而不是StdSerializer。@GrooveRage很乐意提供帮助。