Я использую Spring Boot для написания серверного приложения.Репозиторий доступа или служба от объекта
В большинстве случаев я пишу всю бизнес-логику внутри служб, где я использую @Autowired
для доступа к репозиториям и другим службам.
Однако иногда я хочу получить доступ к определенному сервису или собственности из класса @Entity
, который не может использовать @Autowired
.
Например, у меня есть объект, который должен иметь возможность сериализоваться в JSON. В JSON у него должно быть поле imageUrl, которое содержит имя изображения (хранится в базе данных и как свойство в классе @Entity
) и базовый url, который доступен только в application.properties. Это означает, что я должен использовать аннотацию @Value
внутри класса @Entity
, но это не работает.
Я создать службу, которая выглядит следующим образом:
@Service
public class FilesService {
private static FilesService instance;
@PostConstruct
public void init() {
FilesService.instance = this;
}
public static FilesService getInstance() {
return instance;
}
@Value("${files.path}")
String filesPath;
@Value("${files.url}")
String filesUrl;
public String saveFile(MultipartFile file) throws IOException {
if (file == null || file.isEmpty()) {
return null;
}
String filename = UUID.randomUUID().toString();
file.transferTo(new File(filesPath + filename));
return filename;
}
public String getFileUrl(String filename) {
if (filename == null || filename.length() == 0) {
return null;
}
return filesUrl + filename;
}
}
И тогда внутри @Entity
класса я пишу следующий код:
@JsonProperty
public String getImageUrl() {
return FilesService.getInstance().getFileUrl(imageName);
}
Это работает, но это не выглядит правильно , Более того, я отношусь к тому, может ли это привести к некоторым побочным эффектам при использовании с менее обычными классами @Service
или классами @Repository
.
Что такое правильный способ использовать @Repository
и @Service
классы от @Entity
классов или любых других не @Component
классов (классы не управляемые Spring)?
Почему бы вам не сохранить URL-адрес в этом объекте? Когда клиент/контроллер создает новый объект, путь к файлу может быть передан вашему объекту. Я знаю, что нет установленного правила, но он «чувствует» неправильно иметь эту скрытую зависимость в вашей сущности. – Rabiees
Ну, ntot службы. Написать пользовательский маршаллер – Sarief