Java Установить в объекте, давая пустой JSON массив - PullRequest
1 голос
/ 02 апреля 2020

Я недавно обновил свой проект с весенней загрузки 1.2.4 до 2.0.0. Однако ответ, который я получаю от контроллера, приведенного ниже, создает пустой массив json для части, которая должна быть сопоставлена ​​с Set webappLocales в объекте dto. Я выставил несколько утверждений для печати, чтобы проверить правильность заполнения. Фактически, внутренний ProjectDTO, который также имеет некоторые поля Set, которые правильно конвертируются в массив json. Ниже приведен фрагмент кода и соответствующий код.

enter image description here

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;
    }

}

Контроллер REST

@ApiOperation(value = "Get webapps for current user")
@RequestMapping(value = "/getAll", method = RequestMethod.GET, produces = {
        "application/json" })
@PostFilter("hasPermission(filterObject.getId(), 'com.adobe.onyx.server.model.Webapp', 'read')")
public List<WebappDTO> fetchAll() {
    List<ProjectDTO> projectDTO;
    Set<ProjectConfig> projects;
    List<WebappDTO> webappDTO = new ArrayList<WebappDTO>();

    List<Webapp> webapps = getAllWebapps();

    for (Webapp w : webapps) {

        WebappDTO wdto = new WebappDTO();
        wdto.setId(w.getId());
        wdto.setName(w.getName());
        wdto.setCoreLocale(w.getCoreLocale());
        wdto.setWebappLocales(w.getWebappLocales());
        projects = w.getProjectConfig();
        projectDTO = new ArrayList<ProjectDTO>();

        for (ProjectConfig p : projects) {
            ProjectDTO pd = new ProjectDTO();
            pd.setId(p.getId());
            pd.setAlfProject(p.getAlfProject());
            pd.setMockBuildAvailable(p.isMockBuildAvailable());
            pd.setMockElementOrder(p.getMockElementOrder());
            pd.setMockPrefix(p.getMockPrefix());
            pd.setMockSuffix(p.getMockSuffix());
            pd.setName(p.getName());
            pd.setPlaceholderRegex(p.getPlaceholderRegex());
            pd.setPostProcessors(p.getPostProcessors());
            pd.setProjectStartDate(p.getProjectStartDate());
            pd.setJiraIssueTypeId(p.getJiraIssueTypeId());
            pd.setJiraPriorityId(p.getJiraPriorityId());
            pd.setJiraProjectId(p.getJiraProjectId());
            pd.setBugAssignee(p.getBugAssignee());
            projectDTO.add(pd);
        }
        wdto.setProjects(projectDTO);
        webappDTO.add(wdto);

        Set<WebappLocale> test = wdto.getWebappLocales();
        for (WebappLocale single: test) {
            System.out.println("-----OUTER TEST TEST----" + single.getLocale().toString());
        }

    }
    return webappDTO;
}       

Язык веб-приложений DTO

@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;
}
}

1 Ответ

0 голосов
/ 13 апреля 2020

Похоже, что обновление отменяет свойство поля Id в ответе REST. Я нашел некоторые соответствующие ответы здесь . Ниже приводится решение, которому я следовал, чтобы обойти эту проблему. Найти оригинальное решение здесь

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]));
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...