【发布时间】:2023-02-16 22:52:04
【问题描述】:
我有一个问题,它与我遇到的错误有关。在我的服务中使用循环引用到底有多糟糕?我很清楚错误是由于什么以及如何解决的,只是在我工作的公司中,一位资深人士建议我,对于交易问题,有必要进行这样的循环引用,实际上这是一个非常经常发生的问题在那里练习,但由于我是从头开始一个个人项目,这是我第一次得到错误,它再次引发了疑问。非常感谢您!
这是服务的代码
public class MedicalRecordServiceImpl implements MedicalRecordService {
private final MedicalRecordRepository medicalRecordRepository;
private final MedicalRecordService medicalRecordService;
private final PatientService patientService;
private final TutorService tutorService;
private final MedicalHistoryAnswerService medicalHistoryAnswerService;
private final DentalHistoryAnswerService dentalHistoryAnswerService;
public MedicalRecordServiceImpl(MedicalRecordRepository medicalRecordRepository, MedicalRecordService medicalRecordService, PatientService patientService, TutorService tutorService, MedicalHistoryAnswerService medicalHistoryAnswerService, DentalHistoryAnswerService dentalHistoryAnswerService) {
this.medicalRecordRepository = medicalRecordRepository;
this.medicalRecordService = medicalRecordService;
this.patientService = patientService;
this.tutorService = tutorService;
this.medicalHistoryAnswerService = medicalHistoryAnswerService;
this.dentalHistoryAnswerService = dentalHistoryAnswerService;
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void saveMedicalRecord(MedicalRecordEntity medicalRecord) {
medicalRecordRepository.save(medicalRecord);
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public ResponseEntity<?> createNewMedicalRecord(MedicalRecordDTO medicalRecordDTO) {
PatientEntity patient = this.storeMedicalRecordIntoPatient(medicalRecordDTO);
TutorEntity tutor = this.storeMedicalRecordIntoTutor(medicalRecordDTO);
List<MedicalHistoryAnswerEntity> medicalHistoryAnswers = this.storeMedicalRecordIntoMedicalHisAns(medicalRecordDTO);
List<DentalHistoryAnswerEntity> dentalHistoryAnswers = this.storeMedicalRecordIntoDentalHisAns(medicalRecordDTO);
patientService.savePatient(patient);
tutor.setPatient(patient);
tutorService.saveTutor(tutor);
MedicalRecordEntity medicalRecord = this.createMedicalRecord(patient, tutor);
medicalRecordService.saveMedicalRecord(medicalRecord);
medicalHistoryAnswers.forEach(medicalHistoryAnswer -> {
medicalHistoryAnswer.setMedicalRecord(medicalRecord);
medicalHistoryAnswerService.saveMedicalHistoryAnswer(medicalHistoryAnswer);
});
dentalHistoryAnswers.forEach(dentalHistoryAnswer -> {
dentalHistoryAnswer.setMedicalRecord(medicalRecord);
dentalHistoryAnswerService.saveDentalHistoryAnswer(dentalHistoryAnswer);
});
return ResponseEntity.status(HttpStatus.OK).body("");
}
}
【问题讨论】:
-
除非您有多个
MedicalRecordService的实现,否则使用将引用同一服务实例的引用调用方法没有任何意义(因为 bean 默认为Singleton) -
在这种情况下,自我引用没有意义。如果
saveMedicalRecord将在新事务中运行,那将是有意义的。但在这里它没有意义。该服务的另一个问题是它通过返回属于控制器的ResponseEntity绑定到 Web 层不是你的服务。 -
@M.Deinum 那你建议我直接从控制器返回响应实体?事情是有人教我控制器不应该有任何逻辑,它们应该只限于调用服务然后我从控制器所做的就是调用服务并且已经,然后服务负责返回 200, 404、500...
-
那是错的。您的服务不应该绑定到网络,控制器的责任是将服务答案转换为适合网络的内容,并将来自网络的输入转换为服务可以使用的内容。您的控制器中应该只有转换逻辑(或多或少)。所有业务逻辑都应该驻留在服务中。现在你有一个服务,当从消息队列、soap web 服务等使用时,它是无用的,而你的想法是你应该能够重用它。
标签: java spring spring-boot spring-mvc