Действительно трудно суммировать проблему, но я постараюсь изо всех сил и надеюсь, что вы получите ее. У меня есть enum, который реализует функциональный интерфейс (Выполнение), где единственный метод в Выполнении - это выполнение, которое принимает два параметра
1: AbstractRepository: интерфейс spring-jpa
2: String
Дело в том, что с каждым вложенным перечислением мне нужно реализовать метод execute, но вместо того, чтобы заставить его принимать AbstractRepository, я хочу сделать этопринять интерфейс, который расширяет AbstractRepository.
это перечисление с функциональным интерфейсом.
package com.deepTech.Familytree.enums;
import com.deepTech.Familytree.domain.ImageBox;
import com.deepTech.Familytree.domain.Person;
import com.deepTech.Familytree.exception.PersonException;
import com.deepTech.Familytree.repository.AbstractRepository;
import java.util.Optional;
import static com.deepTech.Familytree.config.AuthDataConfig.getUser;
import static com.deepTech.Familytree.exception.PersonException.ExceptionType.PERSON_NOT_FOUND;
public enum FileManagementEnumExecution implements Execution {
UPLOAD_PERSON_FILE() {
@Override
// rather than AbstractRepository I want to make it accepts a repository that extends an AbstractRepository
public void execute(AbstractRepository repository, String filename) {
Optional<Person> person1 = (Optional<Person>) repository
.finByTEm(getUser().getEmail());
person1.map(person -> person.copyByImage(new ImageBox(filename)));
repository.save(person1.orElseThrow(() -> new PersonException(PERSON_NOT_FOUND)));
}
},
DELETE_PERSON_FILE() {
@Override
public void execute(AbstractRepository repository, String filename) {
Optional<Person> person1 = (Optional<Person>) repository
.finByTEm(getUser().getEmail());
repository.save(person1
.map(Person::withoutImage)
.orElseThrow(() -> new PersonException(PERSON_NOT_FOUND)));
}
},
UPLOAD_VIP_PERSON_FILE() {
@Override
public void execute(AbstractRepository repository, String filename) {
}
},
DELETE_VIP_PERSON_FILE() {
@Override
public void execute(AbstractRepository repository, String filename) {
}
},
UPLOAD_NEWS_FILE() {
@Override
public void execute(AbstractRepository repository, String filename) {
}
},
DELETE_NEWS_FILE() {
@Override
public void execute(AbstractRepository repository, String filename) {
}
};
}
@FunctionalInterface
interface Execution {
void execute(AbstractRepository repository, String filename);
}
@Service
@RequiredArgsConstructor
public class PersonServiceImpl implements PersonInterface {
...
/* somecode */
...
@Override
public UploadFileResponse uploadPersonFile(Long id, MultipartFile file) {
return fileManagementService.uploadFile(file, id, UPLOAD_PERSON_FILE, personRepository);
}
...
/* somecode */
...
}
и здесь класс FileManagementService
@Service
@RequiredArgsConstructor
public class FileManagementService {
...
/* somecode */
...
public UploadFileResponse uploadFile(MultipartFile file, Long id, SsssEnum ssssEnum, AbstractRepository neo4jRepository) {
String fileName = fileStorageService.storeFile(file);
String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/downloadFile/")
.path(fileName)
.toUriString();
FileManagementEnumExecution.execute(neo4jRepository, fileName);
return new UploadFileResponse(fileName, fileDownloadUri,
file.getContentType(), file.getSize());
}
...
/* somecode */
...
}
может кто-нибудь помочь, пожалуйста