У меня есть следующие классы
// КОМПАНИЯ
@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, неверный запрос. Он даже никогда не отправляется на сервер, потому что это плохой запрос.
Если я удаляю объект внутри атрибута ветвей массива (пустой массив), то он работает.
Я дважды проверяю имена своих атрибутов, но все кажется правильным. Я просто не знаю, что не так.
Итак, у Branch есть свойство companyтипа Company. Ваш JSON имеет свойство company типа string. Это явно не соответствует.
@JBNizet My CompanyDTO в методе контроллера имеет массив ветвей и должен обрабатывать его, или, может быть, я вижу его под неправильным углом
Хорошо, и что? Вы все еще пытаетесь преобразовать строку в JSON в объект Company. Это не может работать, потому что... строка не является компанией. Строка — это просто последовательность символов. Компания — это объект с категорией, именем, доменным именем и т. д.
@JBNizet Я все еще получаю ПЛОХОЙ запрос, даже если я удаляю атрибут компании из объекта Json
Вы делаете ту же ошибку для электронной почты. Это строка в вашем JSON. Это объект в вашем классе Address.
прежде всего, вы не должны использовать классы Entity в качестве DTO, это неправильно, вы должны создать отдельный класс BranchDTO, если хотите использовать его в качестве DTO.




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