Возникли проблемы с отправкой массива объектов JSON

У меня есть следующие классы

// КОМПАНИЯ

@Entity
@Table(name=Company.TABLE_NAME)    
public class Company {

        public static final String TABLE_NAME = "company";
        public static final String PK_NAME = "id";

        @Id
        @Column(name = "id")
        private String id = IdGenerator.createId(); 

        @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
        @JoinColumn(name = "categoryid", table=TABLE_NAME) 
        private Category category;

        @Column(name = "name", nullable=false, table=TABLE_NAME)
        @Size(min=2, max=60, message = "LATER")
        private String name;

        @Column(name = "domainName", nullable=true, table=TABLE_NAME)
        private String domainName;  

        @Column(name = "registrationNumber", nullable=true, table=TABLE_NAME)
        private String registrationNumber;

        @Column(name = "description", table=TABLE_NAME)
        private String description;

        @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
        @JoinColumn(name = "itemId")
        private Set<Image> logos = new HashSet<>();

        @OneToMany(mappedBy = "company", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
        private List<Branch> branches = new ArrayList<>();

        public Company() {}

        public void addBranch(Branch branch) {
            branch.setCompany(this);
            branch.getAddress().setActor(this);
            branches.add(branch);
        }

        public void addLogo(Image logo) {

        }

    // GETTERS AND SETTERS

    }

// ВЕТВИ

@Entity
@Table(name=Branch.TABLE_NAME)
public class Branch {

    public static final String TABLE_NAME = "branch";

    @Id
    @Column(name = "id")
    private String id = IdGenerator.createId();

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "address")
    private Address address;

    @Column(name = "telephone")
    private String telephone;

    @ManyToOne
    @JoinColumn(name = "company")
    private Company company;

    public Branch() {
        this.address.setAddressCategory(AddressCategory.BRANCH);
    }

// GETTERS AND SETTERS

}

// АДРЕС

@Entity  
@Table(name=Address.TABLE_ADDRESS) 
public class Address {

    public static final String TABLE_ADDRESS = "address";
    @Id
    @Column(name = "id")
    private String id = IdGenerator.createId();   

    @Column(name = "category", nullable=false)
    private AddressCategory addressCategory;;

    @Column(name = "streetname", nullable=true)
    private String streetname;

    @Column(name = "number", nullable=true)
    private String number;

    @Column(name = "postcode", nullable=true)
    private String postcode;

    @Column(name = "city", nullable=true)
    private String city;

    @Column(name = "country", nullable=true)
    private String country;

    @Column(name = "telephone")
    private String telephone;

    @Embedded
    private EmailAddress email;

    @Column(name = "description", nullable=true)
    private String description;

// GETTERS AND SETTERS
}

// ЭЛ. АДРЕС

@Embeddable
public class EmailAddress {

    @Column(name = "email")
    private String emailAddress;

    public EmailAddress() { }

    public EmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getEmailAddress() { return emailAddress; }
    public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; }

}

// КОМПАНИЯ DTO

public class CompanyDTO {
    private String id;
    private String categoryId;  
    private String name;
    private String domainName;  
    private String registrationNumber;
    private String description;
    private List<Branch> branches = new ArrayList<>();

    public CompanyDTO fromCompany(Company company) {
        this.setId(company.getId());
        this.setName(company.getName());
        this.setDomainName(company.getDomainName());
        this.setRegistrationNumber(company.getRegistrationNumber());
        this.setDescription(company.getDescription()); 
        return this;
    }

    public Company toCompany(Company company) {
        company.setName(getName());
        company.setDomainName(getDomainName());
        company.setRegistrationNumber(getRegistrationNumber());
        company.setDescription(getDescription()); 
        //company.setLogo(new Image()); 
        company.setBranches(this.getBranches());
        return company;
    }

// GETTERS AND SETTERS
}

Метод контроллера:

@PostMapping(path = CREATE_COMPANY)
    public ResponseEntity<?> save(@RequestBody CompanyDTO dto){ System.out.println("__________COMPANY----------");
        Category category = categoryService.findById(dto.getCategoryId());
        Company company = dto.toCompany(new Company());

        company.setCategory(category);

        company.setLogos(new HashSet<Image>(Arrays.asList(new Image("garden", "garden.jpg", "/garden")))); 
        companyService.save(company); 
        return new ResponseEntity<> ("", HttpStatus.CREATED);
    } 

Это JSON, который я отправляю от Postman:

{
"categoryId": "ee6e75c9-2d1b-41c1-8f12-236fbf907683",
"name": "McDonalds",
"domainName": "Vodafone.com",
"registrationNumber": "5555555",
"description": "Vodafone",
"branches": [
    {
        "telephone": "003325647895",
        "address": {
            "addressCategory": "BRANCH",
            "streetname": "Milkweg",
            "number": "50",
            "postcode": "3014",
            "city": "Vienna",
            "country": "Austria",
            "email": {"email": "[email protected]"},
            "telephone": "003325647895",
            "description": "P. O. Box decription",
            "actor": "1abaaa11-1145-432f-84b0-40b9b551acdd"
        }
    }
],
"logos": []
}

И я получаю следующую ошибку в Postman: ошибка 400, неверный запрос. Он даже никогда не отправляется на сервер, потому что это плохой запрос.

Если я удаляю объект внутри атрибута ветвей массива (пустой массив), то он работает.

Я дважды проверяю имена своих атрибутов, но все кажется правильным. Я просто не знаю, что не так.

Что он печатает в журналах сервера, когда вы получаете 400? Вы можете включить org.springframework.web или другие классы/пакеты для просмотра дополнительных журналов.

Laksitha Ranasingha 09.03.2019 11:51

Итак, у Branch есть свойство companyтипа Company. Ваш JSON имеет свойство company типа string. Это явно не соответствует.

JB Nizet 09.03.2019 12:02

@JBNizet My CompanyDTO в методе контроллера имеет массив ветвей и должен обрабатывать его, или, может быть, я вижу его под неправильным углом

Eddy Freeman 09.03.2019 12:15

Хорошо, и что? Вы все еще пытаетесь преобразовать строку в JSON в объект Company. Это не может работать, потому что... строка не является компанией. Строка — это просто последовательность символов. Компания — это объект с категорией, именем, доменным именем и т. д.

JB Nizet 09.03.2019 12:20

@JBNizet Я все еще получаю ПЛОХОЙ запрос, даже если я удаляю атрибут компании из объекта Json

Eddy Freeman 09.03.2019 12:28

Вы делаете ту же ошибку для электронной почты. Это строка в вашем JSON. Это объект в вашем классе Address.

JB Nizet 09.03.2019 12:32

прежде всего, вы не должны использовать классы Entity в качестве DTO, это неправильно, вы должны создать отдельный класс BranchDTO, если хотите использовать его в качестве DTO.

Mayur 09.03.2019 15:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
99
0

Другие вопросы по теме