SpringBoot и MongoDB как абстрагировать похожие объекты - PullRequest
0 голосов
/ 08 февраля 2019

Мое приложение имеет две коллекции баз данных довольно схожей структуры.У 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 для моего абстрактного контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...