对象中的Java集提供空JSON数组

对象中的Java集提供空JSON数组,java,spring,spring-boot,jackson,Java,Spring,Spring Boot,Jackson,我最近将我的项目从SpringBoot1.2.4升级到了2.0.0。但是,我从下面给出的控制器收到的响应会为应该映射到dto对象中的Set webappLocales的部分生成一个空json数组。我放了一些打印语句,以检查内容是否正确填充。实际上,内部ProjectDTO也有一些Set字段,可以正确地转换为json数组。您可以在下面找到输出的一段代码和相应的代码 DTO public class WebappDTO { private long id; private St

我最近将我的项目从SpringBoot1.2.4升级到了2.0.0。但是,我从下面给出的控制器收到的响应会为应该映射到dto对象中的Set webappLocales的部分生成一个空json数组。我放了一些打印语句,以检查内容是否正确填充。实际上,内部ProjectDTO也有一些Set字段,可以正确地转换为json数组。您可以在下面找到输出的一段代码和相应的代码

DTO

public class WebappDTO {

    private long id;

    private String name;

    private Locale coreLocale;

    private Set<WebappLocale> webappLocales;

    private List<ProjectDTO> projects;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Locale getCoreLocale() {
        return coreLocale;
    }

    public void setCoreLocale(Locale coreLocale) {
        this.coreLocale = coreLocale;
    }

    public Set<WebappLocale> getWebappLocales() {
        return webappLocales;
    }

    public void setWebappLocales(Set<WebappLocale> webappLocales) {
        for (WebappLocale single: webappLocales) {
            System.out.println("-----INNER TEST TEST----" + single.getLocale().toString());
        }
        this.webappLocales = webappLocales;
    }

    public List<ProjectDTO> getProjects() {
        return projects;
    }

    public void setProjects(List<ProjectDTO> projectdto) {
        this.projects = projectdto;
    }

}
@Entity
@Table(name = "webapp_locales", uniqueConstraints = { 
@UniqueConstraint(columnNames = {
    "locale_id", "webapp_id" }) })
@XmlRootElement
public class WebappLocale implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;

@ManyToOne
@XmlTransient
@JsonIgnore
@JoinColumn(name = "locale_id")
private Locale locale;

@ManyToOne
@XmlTransient
@JsonIgnore
@JoinColumn(name = "webapp_id")
private Webapp webapp;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Locale getLocale() {
    return locale;
}

public void setLocale(Locale locale) {
    this.locale = locale;
}

public Webapp getWebapp() {
    return webapp;
}

public void setWebapp(Webapp webapp) {
    this.webapp = webapp;
}
}

升级似乎删除了REST响应中的Id字段属性。我找到了一些相关的答案。以下是我为了解决这个问题而采用的解决方案。找到原始解决方案


升级似乎删除了REST响应中的Id字段属性。我找到了一些相关的答案。以下是我为了解决这个问题而采用的解决方案。找到原始解决方案


WebappLocale看起来怎么样?@SimonMartinelli我已经添加了相同的内容供您参考。所有字段上都有JsonIgnore。我只问自己,为什么要从一个古老的不受支持版本升级到一个古老的不受支持版本的框架?所以之前我们得到的JSON对象只包含id'sHow WebappLocale看起来像什么?@SimonMartinelli我已经添加了相同的内容供您参考所有字段上都有JsonIgnore。我只问自己,为什么要从一个古老的不受支持版本升级到一个古老的不受支持版本的框架?所以之前我们得到的JSON对象只包含id的
@Entity
@Table(name = "webapp_locales", uniqueConstraints = { 
@UniqueConstraint(columnNames = {
    "locale_id", "webapp_id" }) })
@XmlRootElement
public class WebappLocale implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;

@ManyToOne
@XmlTransient
@JsonIgnore
@JoinColumn(name = "locale_id")
private Locale locale;

@ManyToOne
@XmlTransient
@JsonIgnore
@JoinColumn(name = "webapp_id")
private Webapp webapp;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Locale getLocale() {
    return locale;
}

public void setLocale(Locale locale) {
    this.locale = locale;
}

public Webapp getWebapp() {
    return webapp;
}

public void setWebapp(Webapp webapp) {
    this.webapp = webapp;
}
}
import java.util.stream.Collectors;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;

@Configuration
public class MyRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {

    @Autowired
    private EntityManager entityManager;

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(e -> e.getJavaType()).collect(Collectors.toList()).toArray(new Class[0]));
    }

}