Код: Выделить всё
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "curriculum_vitae")
public class CurriculumVitae {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String lastName;
@OneToMany(mappedBy = "curriculumVitae", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonManagedReference
private List workExperiences;
@OneToMany(mappedBy = "curriculumVitae", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonManagedReference
private List levelEducations;
}
Код: Выделить всё
[
{
"id": 1,
"name": "Jean Dupont",
"lastName": "Dupont",
"workExperiences": [],
"levelEducations": []
},
{
"id": 2,
"name": "Jean Dupont",
"lastName": "Dupont",
"workExperiences": [],
"levelEducations": []
},
{
"id": 3,
"name": "Jean Dupont",
"lastName": "Dupont",
"workExperiences": [],
"levelEducations": []
},
{
"id": 4,
"name": "Jean Dupont",
"lastName": "Dupont",
"workExperiences": [],
"levelEducations": []
}
]
Код: Выделить всё
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "work_experience")
@JsonIgnoreProperties("curriculumVitae")
public class WorkExperience {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String company;
private String position;
@JsonFormat(pattern = "dd/MM/yyyy")
private Date startDate;
@JsonFormat(pattern = "dd/MM/yyyy")
private Date endDate;
@ManyToOne
@JoinColumn(name = "curriculum_id")
@JsonManagedReference
private CurriculumVitae curriculumVitae;
}
Код: Выделить всё
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CurriculumVitaeDTO implements Serializable {
@Serial
private static final long serialVersionUID = -8732529708250756609L;
private Long id;
private String name;
private String lastName;
private List workExperiences;
private List levelEducations;
}
Код: Выделить всё
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WorkExperienceDTO {
private Long id;
private String company;
private String position;
@JsonFormat(pattern = "dd/MM/yyyy")
private Date startDate;
@JsonFormat(pattern = "dd/MM/yyyy")
private Date endDate;
}
Код: Выделить всё
@Mapper(componentModel = "spring")
public interface CurriculumVitaeMapper {
CurriculumVitaeMapper INSTANCE = Mappers.getMapper(CurriculumVitaeMapper.class);
@Mappings({
@Mapping(source = "id", target = "id"),
@Mapping(source = "workExperiences", target = "workExperiences"),
@Mapping(source = "levelEducations", target = "levelEducations")
})
CurriculumVitaeDTO toDto(CurriculumVitae curriculumVitae);
@Mappings({
@Mapping(source = "id", target = "id"),
@Mapping(source = "workExperiences", target = "workExperiences"),
@Mapping(source = "levelEducations", target = "levelEducations")
})
CurriculumVitae toEntityCurriculumVitae(CurriculumVitaeDTO curriculumVitae);
}
Код: Выделить всё
@Mapper(componentModel = "spring")
public interface WorkExperienceMapper {
WorkExperienceMapper INSTANCE = Mappers.getMapper(WorkExperienceMapper.class);
@Mapping(source = "id", target = "id")
WorkExperienceDTO toWorkExperienceDTO(WorkExperience workExperience);
@Mapping(source = "id", target = "id")
WorkExperience toEntityWorkExperience(WorkExperienceDTO workExperienceDTO);
}
Код: Выделить всё
@Service
public class CurriculumVitaeServiceImpl implements CurriculumVitaeServiceInter {
private final CurriculumVitaeRepository curriculumVitaeRepository;
private final CurriculumVitaeMapper curriculumVitaeMapper;
public CurriculumVitaeServiceImpl(CurriculumVitaeRepository curriculumVitaeRepository, CurriculumVitaeMapper curriculumVitaeMapper) {
this.curriculumVitaeRepository = curriculumVitaeRepository;
this.curriculumVitaeMapper = curriculumVitaeMapper;
}
@Override
public List getAllCurriculumVitaes() {
return curriculumVitaeRepository.findAll()
.stream()
.map(curriculumVitaeMapper::toDto)
.toList();
}
@Override
public CurriculumVitaeDTO createCurriculumVitae(CurriculumVitaeDTO curriculumVitaeDTO) {
if (curriculumVitaeDTO.getName() == null || curriculumVitaeDTO.getName().isEmpty()) {
throw new BadRequestException("The name of Curriculum Vitae is mandatory");
}
var newCurriculumVitae = curriculumVitaeMapper.toEntityCurriculumVitae(curriculumVitaeDTO);
newCurriculumVitae = curriculumVitaeRepository.save(newCurriculumVitae);
return curriculumVitaeMapper.toDto(newCurriculumVitae);
}
@Override
public Optional getCurriculumVitaeById(Long id) {
if (!curriculumVitaeRepository.existsById(id)) {
throw new NotFoundException("Curriculum Vitae with id " + id + " doesn't exist");
}
return curriculumVitaeRepository.findById(id).map(curriculumVitaeMapper::toDto);
}
@Override
public void deleteCurriculumVitae(Long id) {
if (!curriculumVitaeRepository.existsById(id)) {
throw new NotFoundException("Curriculum Vitae with id " + id + " not found");
}
curriculumVitaeRepository.deleteById(id);
}
Код: Выделить всё
@Service
public class WorkExperienceServiceImpl implements WorkExperienceServiceInter {
private final WorkExperienceRepository workExperienceRepository;
private final WorkExperienceMapper workExperienceMapper;
public WorkExperienceServiceImpl(WorkExperienceRepository workExperienceRepository, WorkExperienceMapper workExperienceMapper) {
this.workExperienceRepository = workExperienceRepository;
this.workExperienceMapper = workExperienceMapper;
}
@Override
public List getAllWorkExperience() {
return workExperienceRepository.findAll()
.stream()
.map(workExperienceMapper::toWorkExperienceDTO)
.toList();
}
@Override
public Optional getWorkExperienceById(Long id) {
if (!workExperienceRepository.existsById(id)) {
throw new NotFoundException("Work experience with id " + id + " doesn't exist");
}
return workExperienceRepository.findById(id).map(workExperienceMapper::toWorkExperienceDTO);
}
@Override
public WorkExperienceDTO createWorkExperience(WorkExperienceDTO workExperienceDTO) {
WorkExperience newExperienceDTO = workExperienceMapper.toEntityWorkExperience(workExperienceDTO);
newExperienceDTO = workExperienceRepository.save(newExperienceDTO);
if (workExperienceDTO.getCompany().isEmpty()) {
throw new BadRequestException(" The name of Company is mandatory ");
}
return workExperienceMapper.toWorkExperienceDTO(newExperienceDTO);
}
@Override
public void deleteWorkExperience(Long id) {
if (!workExperienceRepository.existsById(id)) {
throw new NotFoundException("Work experience with id " + id + " not found");
}
workExperienceRepository.deleteById(id);
}
}
Код: Выделить всё
@RestController
@RequestMapping("/api/v1")
@CrossOrigin(origins = "http://localhost:4200")
public class CurriculumVitaeController {
private final CurriculumVitaeServiceInter curriculumVitaeServiceInter;
private final Logger logger = LoggerFactory.getLogger(CurriculumVitaeController.class);
public CurriculumVitaeController(CurriculumVitaeServiceInter curriculumVitaeServiceInter) {
this.curriculumVitaeServiceInter = curriculumVitaeServiceInter;
}
@GetMapping(value = "/curriculumVitaes", produces = MimeTypeUtils.APPLICATION_GRAPHQL_VALUE)
public ResponseEntity getAllCurriculumVitaes() {
List curriculumVitaeDTOList = curriculumVitaeServiceInter.getAllCurriculumVitaes();
if (curriculumVitaeDTOList != null && curriculumVitaeDTOList.isEmpty()) {
return ResponseEntity.noContent().build();
}
logger.info("Find CurriculumVitae service finished");
return ResponseEntity.ok().body(curriculumVitaeDTOList);
}
@PostMapping(value = "/curriculumVitae", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity createCurriculum(@Valid @RequestBody CurriculumVitaeDTO curriculumVitaeDTO) {
if (curriculumVitaeDTO.getName() == null || curriculumVitaeDTO.getName().trim().isEmpty()) {
throw new BusinessException("Curriculum Vitae is required", HttpStatus.BAD_REQUEST);
}
CurriculumVitaeDTO newCurriculumDTO = curriculumVitaeServiceInter.createCurriculumVitae(curriculumVitaeDTO);
return ResponseEntity.status(HttpStatus.CREATED).body(newCurriculumDTO);
}
@GetMapping(value = "/curriculumVitae/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity getCurriculumVitae(@PathVariable Long id) {
Optional newCurriculumVitae = curriculumVitaeServiceInter.getCurriculumVitaeById(id);
return ResponseEntity.status(HttpStatus.OK).body(newCurriculumVitae);
}
@DeleteMapping(value = "/curriculumVitae/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity deleteCurriculumVitae(@PathVariable Long id) {
curriculumVitaeServiceInter.deleteCurriculumVitae(id);
return ResponseEntity.ok().body("Curriculum Vitae is deleted");
}
@PutMapping(value = "/curriculumVitae/update", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity updateCurriculumVitae(@Valid @RequestBody CurriculumVitaeDTO curriculumVitaeDTO) {
if (curriculumVitaeDTO.getId() == null) {
throw new BusinessException("Curriculum Vitae is required", HttpStatus.BAD_REQUEST);
}
CurriculumVitaeDTO updateCurriculumVitae = curriculumVitaeServiceInter.createCurriculumVitae(curriculumVitaeDTO);
return ResponseEntity.status(HttpStatus.OK).body(updateCurriculumVitae);
}
}
Код: Выделить всё
@RestController
@RequestMapping("/api/v1")
@CrossOrigin(origins = "http://localhost:4200")
public class WorkExperienceController {
private final Logger logger = LoggerFactory.getLogger(WorkExperienceController.class);
private final WorkExperienceServiceInter workExperienceServiceInter;
public WorkExperienceController(WorkExperienceServiceInter workExperienceServiceInter) {
this.workExperienceServiceInter = workExperienceServiceInter;
}
@GetMapping(value = "/workExperiences", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity getAllWorkExperience() {
List workExperienceDTOList = workExperienceServiceInter.getAllWorkExperience();
if (workExperienceDTOList.isEmpty()) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(workExperienceDTOList);
}
@PostMapping(value = "/workExperience", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity createWorkExperience(@RequestBody WorkExperienceDTO workExperienceDTO) {
if (workExperienceDTO.getCompany() == null || workExperienceDTO.getCompany().trim().isEmpty()) {
throw new BadRequestException("Company name cannot be empty");
}
WorkExperienceDTO newWorkExperience = workExperienceServiceInter.createWorkExperience(workExperienceDTO);
return ResponseEntity.status(HttpStatus.CREATED).body(newWorkExperience);
}
@GetMapping(value = "/workExperience/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity getWorkExperienceById(@PathVariable Long id) {
Optional workExperienceDTO = workExperienceServiceInter.getWorkExperienceById(id);
return ResponseEntity.status(HttpStatus.OK).body(workExperienceDTO);
}
@DeleteMapping(value = "/workExperience/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity deleteWorkExperience(@PathVariable Long id) {
workExperienceServiceInter.deleteWorkExperience(id);
return ResponseEntity.ok("Work Experience deleted");
}
@PutMapping(value = "/update")
public ResponseEntity updateWorkExperience(@Valid @RequestBody WorkExperienceDTO workExperienceDTO) {
if (workExperienceDTO.getId() == null) {
return ResponseEntity.badRequest().body(null);
}
var updateWorkExperienceDTO = workExperienceServiceInter.createWorkExperience(workExperienceDTO);
return ResponseEntity.ok().body(updateWorkExperienceDTO);
}
}
Я делаю небольшое приложение в Spring Boot для учебной программы. Это мой класс CurriculumVitae, где я столкнулся с проблемой получения пустых списков в ответе JSON от API
Подробнее здесь: https://stackoverflow.com/questions/790 ... not-appear