代码之家  ›  专栏  ›  技术社区  ›  Etienne Baqué

Spring-使用接口时验证具体模型

  •  0
  • Etienne Baqué  · 技术社区  · 10 年前

    我有以下抽象模型类

    public abstract class Thing {
        private String id;
        private String name;
       ...
    }
    

    其他3个模型类扩展了它。让我们称它们为岩石、纸张、剪刀。纸张示例:

    public class Paper extends Thing {
        private String paperFormat;
        ...
    }
    

    我现在需要实现以下CRUD相关接口:

    public interface ThingOperations {
        public String addThingForm();
        public String processAddThing(Thing thing, BindingResult result);
       ...
    }
    

    这里,processAddThing()处理表单模型(addThingForm()初始化表单)。 现在假设我想创建一个与每个具体类(RockController、PaperController和ScissorController)相关的Controller。 这里是PaperController,作为一个示例。

    public class PaperController implements ThingOperations {
        ...
        @Override
        @RequestMapping(value="/processAddPaper", method=RequestMethod.POST)
        public String processAddThing(@Valid Paper newPaper, BindingResult result){  
           ...
        }
    ...
    
    }
    

    你知道问题是什么: processAddThing() 在上面的示例中不正确。根据接口规范,我应该使用Thing类作为要验证的模型。但如果我把 @Valid Thing newThing,我无法将newThing转换为Paper实例,因此,我无法调用(例如)适当的Service和DAO Hibernate实现来创建新的Paper记录。

    如果我想在我的3个控制器上成功实现我的接口,并且仍然应用相关的 @Valid annotation ?

    1 回复  |  直到 10 年前
        1
  •  0
  •   user180100 user180100    10 年前

    您可以在此处使用泛型:

    public interface ThingOperations<T extends Thing> {
        public String addThingForm();
        public String processAddThing(T thing, BindingResult result);
       ...
    }
    

    然后

    public class PaperController implements ThingOperations<Paper> {
        ...
        @Override
        @RequestMapping(value="/processAddPaper", method=RequestMethod.POST)
        public String processAddThing(@Valid Paper newPaper, BindingResult result){