Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Spring MVC控制器调用存储库时出现问题_Spring_Spring Mvc_Spring Roo_Spring Data - Fatal编程技术网

从Spring MVC控制器调用存储库时出现问题

从Spring MVC控制器调用存储库时出现问题,spring,spring-mvc,spring-roo,spring-data,Spring,Spring Mvc,Spring Roo,Spring Data,我有一个Spring MVC应用程序,其中存储库(@Repository)直接注入一些控制器(@Controller),因此有时会绕过服务层 例如:我的存储库中有几个findByXXX方法,但我没有找到一种方法来使用SpringRoo在我的服务中围绕自定义方法自动生成包装器方法 因此,我遇到了一个难题:要么绕过服务层(糟糕),要么花大量时间(糟糕)围绕我的自定义存储库方法在服务层中创建简单的包装器方法。 有人能解决这个难题吗 编辑1:这是@Nabil要求的我的一个控制器: @Controller

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

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

因此,我遇到了一个难题:要么绕过服务层(糟糕),要么花大量时间(糟糕)围绕我的自定义存储库方法在服务层中创建简单的包装器方法。

有人能解决这个难题吗

编辑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(谓词p)
。例如,喜欢建议,甚至更好地使用。然后服务层将构造谓词,而不只是将其委托给较低的层。

您可以发送一个控制器方法的示例吗