Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重构Java方法,使代码赢得';t标记为重复_Java_Spring_Refactoring - Fatal编程技术网

重构Java方法,使代码赢得';t标记为重复

重构Java方法,使代码赢得';t标记为重复,java,spring,refactoring,Java,Spring,Refactoring,我有一个使用SpringBoot和SpringDataJPA接口的项目。有一个方法出现在5个服务中,代码被我的IDE标记为重复。我将发布其中的两个方法,以便您可以看到代码的外观,基本上是相同的,唯一不同的是使用的存储库接口 在AccountRequestService.java中,我有以下方法: public Page<AccountRequest> getAccountRequestPageable(final Pageable pageable, final Strin

我有一个使用SpringBoot和SpringDataJPA接口的项目。有一个方法出现在5个服务中,代码被我的IDE标记为重复。我将发布其中的两个方法,以便您可以看到代码的外观,基本上是相同的,唯一不同的是使用的存储库接口

在AccountRequestService.java中,我有以下方法:


    public Page<AccountRequest> getAccountRequestPageable(final Pageable pageable, final String status) {

        Page<AccountRequest> accountRequestPage;

        if (UNCOMPLETED_STATUS.equals(status)) {
            accountRequestPage = accountRequestRepository.findByBaseRequestInitiatorIgnoreCaseAndBaseRequestOutdatedDaysGreaterThanAndBaseRequestStatus(pageable,
                    LoggedUserUtil.getLoggedUserName(), 0, BaseRequestStatusType.APPROVED);
        } else {
            if (!ALL_STATUS.equals(status)) {
                accountRequestPage = accountRequestRepository.findByBaseRequestStatusAndBaseRequestInitiatorIgnoreCase(pageable,
                        BaseRequestStatusType.valueOf(status), LoggedUserUtil.getLoggedUserName());
            } else {
                accountRequestPage = accountRequestRepository.findByBaseRequestInitiatorIgnoreCase(pageable, LoggedUserUtil.getLoggedUserName());
            }
        }
        return accountRequestPage;
    }


公共页getAccountRequestPageable(最终可分页,最终字符串状态){
页面accountRequestPage;
if(未完成状态等于(状态)){
accountRequestPage=accountRequestRepository.FindBaseRequestInitiatorIgnoRecaseAndBaseRequestOutDateDdaySgreaterThan和BaseRequestStatus(可分页,
LoggedUserUtil.getLoggedUserName(),0,BaseRequestStatusType.APPROVED);
}否则{
如果(!ALL_STATUS.equals(STATUS)){
accountRequestPage=accountRequestRepository.FindBbaseRequestStatus和BaseRequestInitiatorIgnoreCase(可分页,
BaseRequestStatusType.valueOf(status),LoggedUserUtil.getLoggedUserName();
}否则{
accountRequestPage=accountRequestRepository.FindBaseRequestInitiatorIgnoRecase(可分页,LoggedUserUtil.getLoggedUserName());
}
}
返回accountRequestPage;
}
在ApplicationRequestService.java中:

  public Page<ApplicationsRequest> getApplicationsRequestPageable(final Pageable pageable, final String status) {
        Page<ApplicationsRequest> applicationsRequestPage;
        if (UNCOMPLETED_STATUS.equals(status)) {
            applicationsRequestPage = applicationRequestRepository
                    .findByBaseRequestInitiatorIgnoreCaseAndBaseRequestOutdatedDaysGreaterThanAndBaseRequestStatus(pageable, LoggedUserUtil.getLoggedUserName(), 0,
                            BaseRequestStatusType.APPROVED);
        } else {
            if (!ALL_STATUS.equals(status)) {
                applicationsRequestPage = applicationRequestRepository.findByBaseRequestStatusAndBaseRequestInitiatorIgnoreCase(
                        pageable, BaseRequestStatusType.valueOf(status), LoggedUserUtil.getLoggedUserName());
            } else {
                applicationsRequestPage = applicationRequestRepository.findByBaseRequestInitiatorIgnoreCase(pageable, LoggedUserUtil.getLoggedUserName());
            }
        }
        return applicationsRequestPage;
    }
public Page getApplicationsRequestPageable(最终可分页,最终字符串状态){
页面应用程序请求页面;
if(未完成状态等于(状态)){
ApplicationRequestPage=applicationRequestRepository
.FindBaseRequestInitiatorIgnoRecaseAndBaseRequestOutDateDdaySgreaterThan和BaseRequestStatus(可分页,LoggedUserUtil.getLoggedUserName(),0,
BaseRequestStatusType。已批准);
}否则{
如果(!ALL_STATUS.equals(STATUS)){
ApplicationRequestPage=applicationRequestRepository.FindBaseRequestStatus和BaseRequestInitiatorIgnoreCase(
pageable,BaseRequestStatusType.valueOf(status),LoggedUserUtil.getLoggedUserName();
}否则{
ApplicationRequestPage=applicationRequestRepository.FindBaseRequestInitiatorIgnoRecase(可分页,LoggedUserUtil.getLoggedUserName());
}
}
返回申请请求页面;
}
我将发布AccountRequestRepository的代码,因为ApplicationRequestRepository类似,但引用的是对象类型ApplicationRequest,而不是AccountRequest

public interface AccountRequestRepository extends JpaRepository<AccountRequest, Long> {
    AccountRequest findByBaseRequestId(Long id);

    Page<AccountRequest> findByBaseRequestInitiatorIgnoreCaseAndBaseRequestOutdatedDaysGreaterThanAndBaseRequestStatus(Pageable pageable, String initiator,
                                                                                                                       Integer days, BaseRequestStatusType status);

    Page<AccountRequest> findByBaseRequestStatusAndBaseRequestInitiatorIgnoreCase(Pageable pageable, BaseRequestStatusType baseRequestStatusType, String initiator);

    Page<AccountRequest> findByBaseRequestInitiatorIgnoreCase(Pageable pageable, String loggedUserName);

}

公共接口AccountRequestRepository扩展了JpaRepository{
AccountRequestFindBaseRequestId(长id);
Page FindBaseRequestInitiatorIgnoreCaseAndBaseRequestOutDateDdaySgreaterThan和BaseRequestStatus(可分页、可分页、字符串启动器、,
整数天,BaseRequestStatusType状态);
PageFindBaseRequestStatus和BaseRequestInitiatorIgnoreCase(可分页、BaseRequestStatusType、BaseRequestStatusType、字符串启动器);
PageFindBaseRequestInitiatorIgnoreCase(可分页、可分页、字符串loggedUserName);
}

现在我想知道是否有办法重构这段代码,这样我就可以消除重复的代码。我尝试使用Java 8和传递函数来找到解决方案,但我真的不知道如何将其参数化。

我认为您需要的是创建“请求”接口并使用Hibernate的实体继承(Spring数据将理解这一点)如果您不能或出于某种原因不想修改现有的类结构,那么仍然有方法重构此类代码。例如,您可以将查询函数作为参数传递给决定调用哪个查询的通用函数

public Page<AccountRequest> getAccountRequestPageable(final Pageable pageable, final String status) {
    return getPageable(pageable, status,
            p -> accountRequestRepository.findByBaseRequestInitiatorIgnoreCaseAndBaseRequestOutdatedDaysGreaterThanAndBaseRequestStatus(p, LoggedUserUtil.getLoggedUserName(), 0, BaseRequestStatusType.APPROVED),
            p -> accountRequestRepository.findByBaseRequestInitiatorIgnoreCase(p, LoggedUserUtil.getLoggedUserName()),
            p -> accountRequestRepository.findByBaseRequestStatusAndBaseRequestInitiatorIgnoreCase(p, BaseRequestStatusType.valueOf(status), LoggedUserUtil.getLoggedUserName()));
}

public Page<ApplicationsRequest> getApplicationsRequestPageable(final Pageable pageable, final String status) {
    return getPageable(pageable, status, 
            p -> applicationRequestRepository.findByBaseRequestInitiatorIgnoreCaseAndBaseRequestOutdatedDaysGreaterThanAndBaseRequestStatus(pageable, LoggedUserUtil.getLoggedUserName(), 0,BaseRequestStatusType.APPROVED),                
            p -> applicationRequestRepository.findByBaseRequestInitiatorIgnoreCase(pageable, LoggedUserUtil.getLoggedUserName()),
            p -> applicationRequestRepository.findByBaseRequestStatusAndBaseRequestInitiatorIgnoreCase(pageable, BaseRequestStatusType.valueOf(status), LoggedUserUtil.getLoggedUserName()));                            
}
           
public static <T,Q> Page<Q> getPageable(final Pageable pageable, final String status, 
        Function<Pageable, Page<Q>> findUncompleted,
        Function<Pageable, Page<Q>> findAll,
        Function<Pageable, Page<Q>> findOther
        ) {

    Page<Q> accountRequestPage;

    if (UNCOMPLETED_STATUS.equals(status)) {
        accountRequestPage = findUncompleted.apply(pageable);
    } else {
        if (!ALL_STATUS.equals(status)) {
            accountRequestPage = findOther.apply(pageable);
        } else {
            accountRequestPage = findAll.apply(pageable);
        }
    }
    return accountRequestPage;
}
public Page getAccountRequestPageable(最终可分页,最终字符串状态){
返回getPageable(可分页,状态,
p->accountRequestRepository.FindBbaseRequestInitiatorIgnoreCaseandBaseRequestOutDateDdaySgreaterThanAndBaseRequestStatus(p,LoggedUserUtil.getLoggedUserName(),0,BaseRequestStatusType.APPROVED),
p->accountRequestRepository.FindBayBaseRequestInitiationOrignoreCase(p,LoggedUserUtil.getLoggedUserName()),
p->accountRequestRepository.FindBbaseRequestStatus和BaseRequestInitiatorIgnoreCase(p,BaseRequestStatusType.valueOf(status),LoggedUserUtil.getLoggedUserName());
}
公共页GetApplicationRequestPageable(最终可分页,最终字符串状态){
返回getPageable(可分页,状态,
p->applicationRequestRepository.FindBbaseRequestInitiatorIgnoreCaseandBaseRequestOutDateDdaySgreaterThanAndBaseRequestStatus(可分页,LoggedUserUtil.getLoggedUserName(),0,BaseRequestStatusType.APPROVED),
p->applicationRequestRepository.FindBaseRequestInitiatorIgnoreCase(可分页,LoggedUserUtil.getLoggedUserName()),
p->applicationRequestRepository.FindBbaseRequestStatus和BaseRequestInitiatorIgnoreCase(可分页,BaseRequestStatusType.valueOf(状态),LoggedUserUtil.getLoggedUserName());
}
公共静态页面getPageable(最终可分页、最终字符串状态、,
功能完成,
函数findAll,
函数findOther
) {
页面accountRequestPage;
if(未完成状态等于(状态)){
accountRequestPage=findUncompleted.apply(可分页);
}否则{
如果(!ALL_STATUS.equals(STATUS)){
accountRequestPage=findOther.apply(可分页);
}否则{
accountRequestPage=findAll.apply(可分页);