2016-07-26 1 views
4

Я использую 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)?

+0

Почему бы вам не сохранить URL-адрес в этом объекте? Когда клиент/контроллер создает новый объект, путь к файлу может быть передан вашему объекту. Я знаю, что нет установленного правила, но он «чувствует» неправильно иметь эту скрытую зависимость в вашей сущности. – Rabiees

+1

Ну, ntot службы. Написать пользовательский маршаллер – Sarief

ответ

2

Хорошо, я бы сказал, что нет правильного способа использования репозиториев и сервисов от объектов, поскольку каждый слой моего существа кричит о неточности, но, как говорится, вы можете обратиться к this link за предложениями о том, как это сделать.

В вашем случае, я думаю, это должно позволить вам заполнить поля в ваших сущностях, что на самом деле было бы предпочтительнее для автоуслуги службы.

Смежные вопросы