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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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应用程序中的设计问题:我应该在哪一层(web、服务或存储库)检索当前登录的用户?_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Spring应用程序中的设计问题:我应该在哪一层(web、服务或存储库)检索当前登录的用户?

Spring应用程序中的设计问题:我应该在哪一层(web、服务或存储库)检索当前登录的用户?,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,我在CRUD Spring应用程序上工作。让我解释一个基本用例: 用户可以保存广告。从现在起,我在web/控制器层中检索当前登录的成员,然后将其传递到服务层,以便在广告上设置该成员(当前登录的用户是播发的所有者;可以使用Spring Security和我的自定义批注来检索播发:@CurrentMember) 在控制器层: @RequestMapping(value = "/family/new", method = RequestMethod.POST, produces = "text/htm

我在CRUD Spring应用程序上工作。让我解释一个基本用例:

用户可以保存
广告
。从现在起,我在web/控制器层中检索当前登录的成员,然后将其传递到服务层,以便在广告上设置该成员(当前登录的用户是播发的所有者;可以使用Spring Security和我的自定义批注来检索播发:
@CurrentMember

控制器层:

@RequestMapping(value = "/family/new", method = RequestMethod.POST, produces = "text/html")
public String newFamilyAdvertisement(
        @ModelAttribute("advertisementInfo") @Validated(value = ValidationGroups.AdvertisementCreation.class) FamilyAdvertisementInfo familyAdvertisementInfo,
        BindingResult bindingResult, Model model, @CurrentMember Member member) {
    if (bindingResult.hasErrors()) {
        populateFamilyAdvertisementModel(model, familyAdvertisementInfo, member);
        return "advertisement/family/new";
    }
    advertisementService.createAdvertisement(member, familyAdvertisementInfo.getAdvertisement(), familyAdvertisementInfo.getAddressReference());
    return "redirect:/advertisement/family/new";
}
@Override
public void createAdvertisement(Member member, Advertisement advertisement, String addressReference) {
    if (member == null || advertisement == null || addressReference == null || addressReference.isEmpty()) {
        throw new IllegalArgumentException("One argument is null or empty");
    }
    Address address = geolocationService.retrieveAddressFromReference(addressReference);
    advertisement.setAddress(address);
    advertisement.setMember(member);//SET CURRENTLY LOGGED IN USER
    advertisement.setValidated(Boolean.FALSE);
    advertisement.setActive(Boolean.TRUE);
    advertisement.setCreationDate(utils.now());
    saveAdvertisement(advertisement);
}
服务层:

@RequestMapping(value = "/family/new", method = RequestMethod.POST, produces = "text/html")
public String newFamilyAdvertisement(
        @ModelAttribute("advertisementInfo") @Validated(value = ValidationGroups.AdvertisementCreation.class) FamilyAdvertisementInfo familyAdvertisementInfo,
        BindingResult bindingResult, Model model, @CurrentMember Member member) {
    if (bindingResult.hasErrors()) {
        populateFamilyAdvertisementModel(model, familyAdvertisementInfo, member);
        return "advertisement/family/new";
    }
    advertisementService.createAdvertisement(member, familyAdvertisementInfo.getAdvertisement(), familyAdvertisementInfo.getAddressReference());
    return "redirect:/advertisement/family/new";
}
@Override
public void createAdvertisement(Member member, Advertisement advertisement, String addressReference) {
    if (member == null || advertisement == null || addressReference == null || addressReference.isEmpty()) {
        throw new IllegalArgumentException("One argument is null or empty");
    }
    Address address = geolocationService.retrieveAddressFromReference(addressReference);
    advertisement.setAddress(address);
    advertisement.setMember(member);//SET CURRENTLY LOGGED IN USER
    advertisement.setValidated(Boolean.FALSE);
    advertisement.setActive(Boolean.TRUE);
    advertisement.setCreationDate(utils.now());
    saveAdvertisement(advertisement);
}
仍在服务层中(Roo ITD):

现在我的问题是:

  • 我是否应该尽早检索当前用户/成员(在web层中),然后将其传递到需要的位置(在服务层中)?还是
  • 我是否应该仅在需要时检索当前用户/成员(在服务层中)

这是一个设计和选择的问题,通常你不需要麻烦控制器将成员传递给服务。它不需要任何关于用户的知识。你可以轻松地将其加载到服务中,因此你的api更短/更干净

但是,如果您的api是从某个外部项目使用的,那么api应该显示使其工作所需的对象


总而言之,在您的情况下,我会将其加载到服务中。

这是一个设计和选择的问题,您需要做出选择,通常您不需要麻烦控制器将成员传递给服务。它不需要任何关于用户的知识。您可以轻松地将其加载到服务中,因此您的api更短/更干净

但是,如果您的api是从某个外部项目使用的,那么api应该显示使其工作所需的对象

总而言之,在您的情况下,我会将其加载到服务中