0
私は、Spring MVC、Spring Security、およびHibernateでWebアプリケーションを設計しました。 私はサービス層と相互作用し、コントローラがあります。Spring MVCでコントローラとサービスレイヤ間の正しい対話を実装する方法
@Controller
@RequestMapping(value="/")
public class InitController {
@Autowired
private UserService userService;
@Autowired
private StudentService studentService;
@InitBinder
public void initBinder(WebDataBinder dataBinder){
dataBinder.registerCustomEditor(String.class, "studentGroup", new StudentNameEditor());
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView getLoginForm(){
return new ModelAndView("login");
}
@RequestMapping(value = "/registration.html",method = RequestMethod.GET)
public ModelAndView getRegistrationForm(){
return new ModelAndView("registration");
}
@RequestMapping(value = "/students.html",method = RequestMethod.GET)
public ModelAndView getGroupForm(){
return new ModelAndView("searchStudents");
}
@RequestMapping(value = "/getStudents.html",method = RequestMethod.POST)
public ModelAndView getStudents(@Valid @ModelAttribute("student") Student student,
BindingResult result){
if(result.hasErrors()){
return new ModelAndView("searchStudents");
}else{
return studentService.getStudentOfGroup(student);
}
}
@RequestMapping(value = "/registrationConfirm.html",method = RequestMethod.POST)
public ModelAndView registration(@Valid @ModelAttribute("user") User user,
BindingResult result){
if(result.hasErrors()){
return new ModelAndView("registration");
}else{
User savedUser = userService.registerUser(user);
if(Objects.isNull(savedUser)){
ModelAndView modelAndView = new ModelAndView("login");
modelAndView.addObject("resultRegistration",
"Success registration!");
return modelAndView;
}else{
ModelAndView modelAndView = new ModelAndView("registration");
modelAndView.addObject("resultRegistration",
"User with the same login or password is registered in system already");
return modelAndView;
}
}
}
}
サービス層は、DAO層と相互作用します。
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDao;
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public User registerUser(User user) {
User userWithTheSameLogin = userDao.getUserByLogin(user.getUserLogin());
if(!Objects.isNull(userWithTheSameLogin)){
//if user with the same login registered already
return userWithTheSameLogin;
}else{
User userWithTheSamePassword = userDao.getUserByEmail(user.getUserEmail());
if(!Objects.isNull(userWithTheSamePassword)){
//if user with the same email registered already
return userWithTheSamePassword;
}
else{
//if user's credentials are unique
userDao.saveUser(user);
return null;
}
}
}
}
私はサービスの電子メールまたはログインが存在していた層、およびヌルからユーザーを返す保存するときには成功しました。
単純な戻り値 - それは悪いと思いますが、論理ではなく、はっきりとはありません。 アドバイス私は、ユーザーを保存した結果についてコントローラに通知するための最善の方法をお勧めします。それは例外をスローし、コントローラーで捕捉しているか、サービス層からステータスコードを返していますか?例を示してください。私は非常に感謝するでしょう
はい、これは私には良い感じです。 – Yuriy
'UserIdOrEmail'のクエリを作成して、両方のクエリを1つのクエリで確認することもできます。あなたはそれが受け入れられるべきだと思うならば、答えを受け入れるほど親切ですか? –
はい、私は1つのクエリを書くつもりです。ありがとう) – Yuriy