Spring,MVC和重用模型部分的策略

时间:2016-03-09 23:50:15

标签: java spring spring-mvc

我很难理解重用某些代码的最佳策略是什么。通常,我在Spring中有控制器:

@Controller
public class PageX1{
  @Autowired
  HeaderService header;

  @Autowired
  CatalogService catalog;

  @RequestMapping("/test1")
  public String controller(Map<String, Object> model)  {             

    setHeaderObjectsIntoModel(model, "a param");
    setCatalogObjectsInyoModel(model, "another param", 1212, "more params");
  }

   private setHeaderObjectsIntoModel(Map<String, Object> model, String aParam){
     Object value = header.getObjectWithParam(aParam);
     model.put("key", value);  
   }

   ....
}

我可能需要在另一个控制器中重用与服务S1相关的部分,例如

@Controller
public class PageX2{
  @Autowired
  HeaderService s;

  @RequestMapping("/test2")
  public String controller(Map<String, Object> model)  {
    setHeaderObjectsIntoModel(model, "a new param");
  }
}

和S2一样,一次又一次。 我不想重复代码。我脑子里有一些想法,但我认为没有什么好处(比如有一个用@Component注释的类实现了一个旨在处理模型的接口,但我应该让参数通用,我想让它具体化尽量减少错误。)

什么是正确的方法? 任何例子都非常受欢迎

1 个答案:

答案 0 :(得分:1)

您有两种选择。第一个选项是你可以有一个基本控制器,它提供了控制器继承的通用功能

public abstract class AbstractPage{

   @Autowired
   private HeaderService s;

   protected Object retrieveObjectWithParam(String param){
      return s.getObjectWithParam(param);
   }
}

@Controller
public class PageX1 extends AbstractPage{

  @RequestMapping("/test1")
  public String controller(Map<String, Object> model)  { 
    Object headerParam = retrieveObjectWithParam("a param");
    model.put("key" , headerParam);
  }
}

第二个选项是使用@ControllerAdvice注释类,为控制器提供通用模型属性

@ControllerAdvice
public class PageAdvice{

    @Autowired
    private HeaderService s;

   @ModelAttribute("headerParam")
   public Object retriveHeaderParm(){
      return s.getObjectWithParam("a param");
   }
}