Мое приложение имеет две коллекции баз данных довольно схожей структуры.У Sonar теперь есть несколько дубликатов кода между моими двумя контроллерами, которые обрабатывают объекты этих коллекций.Поэтому моя цель состоит в том, чтобы абстрактный контроллер заботился о взаимодействии с БД, но в настоящее время я понятия не имею, как мне этого добиться.
Здесь представлены два моих класса сущностей и их общие интерфейсы (некоторые сеттеры опущены):
public interface Auditable {
Audit getAudit();
void setAudit(Audit audit);
}
public interface BinaryEntity extends Auditable {
String getId();
String getEntityId();
void setEntityId(String id)
int getVersion();
void setVersion(int version);
String getVersionDescription();
String getFileName();
MetaData getMetaData();
Binary getFile();
}
@Data
@Document(collection = "files")
public class FileEntity implements BinaryEntity {
@Id
private String id;
private String fileId;
private int version;
private String versionDescription;
private String fileName;
private String mimeType;
private MetaData metaData;
private Audit audit;
private Binary file;
public FileEntity(String fileName, String mimeType) {
this.fileName = fileName;
this.mimeType = mimeType;
}
@Override
public String getEntityId() {
return fileId;
}
@Override
public void setEntityId(String id) {
this.fileId = id;
}
}
@Data
@Document(collection = "forms")
public class FormEntity implements BinaryEntity {
@Id
private String id;
private String formId;
private int version;
private String versionDescription;
private String fileName;
private MetaData metaData;
private PdfSettings settings;
private Audit audit;
private List<Mapping> mappings;
private Binary file;
private String password;
public FormEntity(String fileName) {
this.fileName = fileName;
}
@Override
public String getEntityId() {
return formId;
}
@Override
public void setEntityId(String id) {
this.formId = id;
}
}
Теперь давайте начнем со вставки.Я попробовал следующее, но когда я пытаюсь вызвать его, я получаю ошибку компиляции: «BinaryController не применим для аргументов (User, MultipartFile, FileRepository)», хотя FileRepository extends MongoRepository<FileEntity, String>
:
public ResponseEntity<Object> uploadFile(User principal, MultipartFile fileParam,
MongoRepository<BinaryEntity, String> repository) {
try {
BinaryEntity binary = createFormFromMultipart(fileParam);
binary.setAudit(Audit.buildCreated(userService.getUser(principal)));
repository.insert(binary);
binary.setEntityId(binary.getId());
binary.setVersion(1);
repository.save(binary);
return ResponseUtils.sendResponseObjectAsJson(binary, HttpStatus.OK);
} catch (IOException e) {
LOGGER.error(COULD_NOT_UPLOAD + ": ", e);
return ResponseUtils.sendResponseObjectAsJson(COULD_NOT_UPLOAD_MESSAGE, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Этодаже как-то возможно, и если да, то как мне этого добиться?
РЕДАКТИРОВАТЬ: Поскольку я до сих пор не получил ни ответов, ни даже комментариев, я немного поиграл и справился с частичной абстракцией.Все методы repository
все еще находятся в наследующих контроллерах и заключены в абстрактный метод:
abstract BinaryEntity createFormFromMultipart(MultipartFile fileParam) throws IOException;
abstract BinaryEntity insert(BinaryEntity entity);
abstract BinaryEntity save(BinaryEntity entity);
abstract Optional<? extends BinaryEntity> findById(String dbId);
abstract Optional<? extends BinaryEntity> findLatestVersion(String entityId);
abstract Optional<? extends BinaryEntity> findByVersion(String entityId, int version);
Но, тем не менее, должен быть способ, которым я мог бы предоставить универсальный MongoRepository
для моего абстрактного контроллера.