[英]Issue with calling repositories from Spring MVC controllers
我有一个带有存储库( @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文档所建议的那样,甚至更好地使用QueryDSL 。 然后服务层将构造谓词而不是仅委托给较低层。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.