其他分享
首页 > 其他分享> > 从Spring MVC控制器调用存储库的问题

从Spring MVC控制器调用存储库的问题

作者:互联网

我有一个带有存储库(@Repository)的Spring MVC应用程序直接注入到某些控制器(@Controller)中,因此有时会绕过服务层.

例如:我的存储库中有几个findByXXX方法,我没有找到一种方法来自动生成使用Spring Roo的服务中自定义方法的包装器方法.

因此,我有一个两难的境地:绕过服务层(坏)或花费大量时间(坏)在我的自定义存储库方法的Service层中创建简单的包装器方法.

有没有人能解决这个难题?

编辑1:这是@Nabil要求的我的控制器之一:

@Controller
@RequestMapping("/signup")
public class SignupController {

    @Autowired
    private SignupService signupService;

    @Autowired
    private SigninService signinService;

    @Autowired
    private MemberRepository memberRepository;

    @Autowired
    private PreferenceService preferenceService;

    @RequestMapping(method = RequestMethod.GET, produces = "text/html")
    public String signupForm(@ModelAttribute SignupInfo signupInfo, Model model) {
        populateForm(model, signupInfo);
        return "signup";
    }

    @RequestMapping(method = RequestMethod.POST, produces = "text/html")
    public String signup(@ModelAttribute @Validated({ Validation.Signup.class }) SignupInfo signupInfo, BindingResult bindingResult, Model model) {
        if (!preferenceService.isEmailAvailable(signupInfo.getMember().getEmail())) {
            bindingResult.rejectValue("member.email", "controller.signup.email_already_used");
        }

        if (bindingResult.hasErrors()) {
            populateForm(model, signupInfo);
            return "signup";
        }

        signupService.signupMember(signupInfo.getMember(), signupInfo.getAddressReference());
        signinService.signin(memberRepository.findByEmail(signupInfo.getMember().getEmail()));
        return "redirect:preference/email";
    }

    private void populateForm(Model model, SignupInfo signupInfo) {
        model.addAttribute("signupInfo", signupInfo);
        model.addAttribute("roles", Arrays.asList(Role.ROLE_BASIC_CHILDMINDER, Role.ROLE_BASIC_FAMILY));
    }
}

解决方法:

解决方案是将您的整个业务逻辑放入服务中.控制器的职责应该是将HTTP请求转换为单个服务调用,而不是将结果或异常转换为HTTP响应.该服务应调用执行业务操作所需的所有存储库和其他服务.

至于几个findByXXX,代表团并不是坏事.但是我会在存储库层中使用通用单一方法findAll(Predicate p).即像Spring Data JPA docs建议,甚至更好地使用QueryDSL.然后服务层将构建谓词而不是仅委托给较低层.

标签:spring-mvc,spring,spring-data,spring-roo
来源: https://codeday.me/bug/20190624/1282436.html