【问题标题】:Issue with calling repositories from Spring MVC controllers从 Spring MVC 控制器调用存储库的问题
【发布时间】:2013-09-10 07:35:11
【问题描述】:

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

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

因此,我面临两难境地:要么绕过服务层(不好),要么花费大量时间(不好)在服务层中围绕我的自定义存储库方法创建简单的包装器方法。

有没有人解决这个困境?

编辑 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));
    }
}

【问题讨论】:

  • 你能发一个你的控制器方法的例子吗

标签: spring spring-mvc spring-roo spring-data


【解决方案1】:

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

至于几个findByXXX,委托也不是坏事。但是,我会在存储库层使用通用的单一方法findAll(Predicate p)。 IE。喜欢Spring Data JPA docs 建议,甚至更好地使用QueryDSL。然后服务层将构造谓词,而不是仅仅委托给较低层。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2016-05-16
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多