Spring应用程序中的设计问题:我应该在哪一层(web、服务或存储库)检索当前登录的用户?
我在CRUD Spring应用程序上工作。让我解释一个基本用例: 用户可以保存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
广告
。从现在起,我在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应该显示使其工作所需的对象 总而言之,在您的情况下,我会将其加载到服务中