避免在Controllers和服务中重复代码

时间:2019-10-15 09:23:17

标签: spring controller

我正在使用Spring框架。

我写了一些很长的代码来保存一些结果。

因此,后来在其他控制器中发现,我还将需要此代码。只是有些小差异,例如返回其他字符串。

因此,每个控制器当然都有自己的映射。因此,无论如何这些参数都是重复的。 但是现在对于代码里面的映射方法。

我当时正在考虑将代码放入原始控制器的服务中。然后其他控制器将调用此服务。当然,该服务将具有大量参数+控制器之间的细微差别。还是应该让我像一般服务人员那样在那儿拥有良好的文档,因为当然这里的方法会是一般性的,以后我应该知道它们的用途。

@PostMapping("/testcase") public RedirectView saveResult(Model model, @ModelAttribute("testResultEntity") TestResultEntity testResultEntity, RedirectAttributes redirectAttributes , @RequestParam(required = false) String version , @RequestParam(required = false,defaultValue = "0") String page, @RequestParam(required = false) String operation, Authentication authentication,Locale locale) 
{ // here comes long code, which will be used also in other controllers ; 
} 

1 个答案:

答案 0 :(得分:0)

如果所有控制器映射都具有相同的签名,则可以使用通用实现创建父类。

类似这样的东西:

public abstract class BaseAbstractController {

     // specific logic per controller
     abstract String specific();

    public RedirectView save(Model model, @ModelAttribute("testResultEntity") TestResultEntity testResultEntity, 
         RedirectAttributes redirectAttributes, @RequestParam(required = false) String version, 
         @RequestParam(required = false, defaultValue = "0") String page, @RequestParam(required = false) String operation, 
         Authentication authentication, Locale locale) { 
          // here comes long code, which will be used also in other controllers ; 

          String specific = specific();
     }

}

@Controller
public class TestController extends BaseAbstractController {

    @Override
    String specific() {
       return "something"; // here goes your specific logic;
    }

    @PostMapping("/testcase") 
    public RedirectView saveResult(Model model, @ModelAttribute("testResultEntity") TestResultEntity testResultEntity, 
         RedirectAttributes redirectAttributes, @RequestParam(required = false) String version, 
         @RequestParam(required = false, defaultValue = "0") String page, @RequestParam(required = false) String operation, 
         Authentication authentication, Locale locale) { 

          return save(model, testResultEntity, redirectAttributes, version, page, operation, authentication, locale);

     }
}