如何避免工厂模式中的Java泛型警告

如何避免工厂模式中的Java泛型警告,java,generics,design-patterns,rule-engine,Java,Generics,Design Patterns,Rule Engine,我想通过使用工厂设计模式和添加一些类似规则引擎的规则链接,实现通用验证器来验证服务层中的业务规则。我有一个有效的解决方案,我不确定这是否是最好的方法 我的问题是:我想确保编译时的类型安全,而不是在运行时拥有/检查类类型。所以,它将使开发人员能够安全地使用该方法,而不会有发生ClassCastException的机会。这是我想解决的最后一个警告,但到目前为止还没有解决,如果我的设计中有什么不清楚的地方,我需要一些帮助并公开征求建议: 未选中调用“验证(T)”作为原始类型的成员 “…验证器” 我得到

我想通过使用工厂设计模式和添加一些类似规则引擎的规则链接,实现通用验证器来验证服务层中的业务规则。我有一个有效的解决方案,我不确定这是否是最好的方法

我的问题是:我想确保编译时的类型安全,而不是在运行时拥有/检查类类型。所以,它将使开发人员能够安全地使用该方法,而不会有发生ClassCastException的机会。这是我想解决的最后一个警告,但到目前为止还没有解决,如果我的设计中有什么不清楚的地方,我需要一些帮助并公开征求建议:

未选中调用“验证(T)”作为原始类型的成员 “…验证器”

我得到警告:

Validator validator = assignedSelectionValidatorFactory.createValidator(ValidationMode.SAVE);
validator.validate(new AssignedSelectionValidatable(assignSelectionRequestDto));
这是我的工厂界面

public interface ValidatorFactory {

    /**
     * Creates factory which returns {@link Validator} based on the {@link ValidationMode}
     */
    Validator createValidator(ValidationMode validationMode);
}
public interface Validator<T extends Validatable> {

    /**
     * Validates each validation rules
     */
    void validate(T objectsToValidate);

}
这里是我工厂的具体实施

@Component
public class AssignedSelectionValidatorFactory implements ValidatorFactory {

    private AssignedSelectionSaveValidator assignedSelectionSaveValidator;

    public AssignedSelectionValidatorFactory(AssignedSelectionSaveValidator assignedSelectionSaveValidator) {
        this.assignedSelectionSaveValidator = assignedSelectionSaveValidator;
    }

    @Override
    public Validator createValidator(ValidationMode validationMode) {
        switch (validationMode) {
            case SAVE:
                return assignedSelectionSaveValidator;
            default:
                return null;
        }
    }
}
这是验证器接口

public interface ValidatorFactory {

    /**
     * Creates factory which returns {@link Validator} based on the {@link ValidationMode}
     */
    Validator createValidator(ValidationMode validationMode);
}
public interface Validator<T extends Validatable> {

    /**
     * Validates each validation rules
     */
    void validate(T objectsToValidate);

}
公共接口验证程序{
/**
*验证每个验证规则
*/
无效验证(T objectsToValidate);
}
下面是验证器接口的具体实现。这将在其实现中调用验证规则

@Component
public class AssignedSelectionSaveValidator implements Validator<AssignedSelectionValidatable> {

    private AssignedSelectionUniqueRule assignedSelectionUniqueRule;

    AssignedSelectionSaveValidator(AssignedSelectionUniqueRule assignedSelectionUniqueRule) {
        this.assignedSelectionUniqueRule = assignedSelectionUniqueRule;
    }

    @Override
    public void validate(AssignedSelectionValidatable assignedSelectionValidatable) {
        assignedSelectionUniqueRule.apply(assignedSelectionValidatable.getAssignSelectionRequestDto());
    }

}
@组件
公共类AssignedSelectionSaveValidator实现验证器{
私有分配的SelectionUniquerule分配的SelectionUniquerule;
AssignedSelectionSaveValidator(AssignedSelectionUniqueRule AssignedSelectionUniqueRule){
this.assignedSelectionUniqueRule=assignedSelectionUniqueRule;
}
@凌驾
公共无效验证(AssignedSelectionValidable AssignedSelectionValidable){
assignedSelectionUniqueRule.apply(assignedSelectionValidatable.getAssignSelectionRequestDto());
}
}
下面是验证规则。每个验证规则都是独立的,因此它们是可重用的。我也不能让他们实现一些ValidationRule->apply(t genericInterface)接口,因为每个ValidationRule可能会得到不同的参数。我不想通过从接口获取参数来让它变得更复杂,但我也愿意听取任何建议

@Component
public class AssignedSelectionUniqueRule {

    private AssignedSelectionRepository assignedSelectionRepository;

    public AssignedSelectionUniqueRule(AssignedSelectionRepository assignedSelectionRepository) {
        this.assignedSelectionRepository = assignedSelectionRepository;
    }

    public void apply(AssignSelectionRequestDto objectToValidate) {

        Optional<AssignedSelection> foundAssignedSelection =
            assignedSelectionRepository.getBy(objectToValidate.getSelectionDto().getId(),
                objectToValidate.getCampaignUuid());

        if (foundAssignedSelection.isPresent()) {
            throw new BadRequestException(
                "AssignedSelection is already exists with campaignUuid: {} and selectionUuid: {}");
        }
    }
}
@组件
指定的公共类SelectionUniquerule{
私有分配的SelectionRepository分配的SelectionRepository;
公共分配的SelectionUniquerule(分配的SelectionRepository分配的SelectionRepository){
this.assignedSelectionRepository=assignedSelectionRepository;
}
公共无效应用(AssignSelectionRequestdToObjectToValidate){
可选foundAssignedSelection=
assignedSelectionRepository.getBy(objectToValidate.getSelectionDto().getId(),
objectToValidate.getCampaignUuid());
if(foundAssignedSelection.isPresent()){
抛出新的BadRequestException(
“AssignedSelection已存在,其活动UUID:{}和selectionUuid:{}”);
}
}
}

首先,在
AssignedSelectionValidatorFactory
内部,您应该在
验证器上定义HAS-a关系,而不是在其具体实现上

     public class AssignedSelectionValidatorFactory implements ValidatorFactory {
         private Validator<T> validator;
.......
public类AssignedSelectionValidatorFactory实现ValidatorFactory{
私人验证器;
.......
创建factory对象时,需要为T传递一个有效类型,在您的情况下,该类型为
assignedSelectionValidable

我希望这能解决你的问题