2016-05-09 7 views
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; 
      } 
     } 

    } 
} 

私はサービスの電子メールまたはログインが存在していた層、およびヌルからユーザーを返す保存するときには成功しました。

単純な戻り値 - それは悪いと思いますが、論理ではなく、はっきりとはありません。 アドバイス私は、ユーザーを保存した結果についてコントローラに通知するための最善の方法をお勧めします。それは例外をスローし、コントローラーで捕捉しているか、サービス層からステータスコードを返していますか?例を示してください。私は非常に感謝するでしょう

答えて

1

私の提案で、ユーザはそれ以外の場合はfalseに登録することができた場合registerUserが真のブール値を返す:あなたのコントローラで

@Transactional(propagation = Propagation.REQUIRES_NEW) 
@Override 
public boolean registerUser(User user) { 
    User userWithTheSameLogin = userDao.getUserByLogin(user.getUserLogin()); 
    if(!Objects.isNull(userWithTheSameLogin)){ 
     //if user with the same login registered already 
     return false; 
    } 
    User userWithTheSamePassword = userDao.getUserByEmail(user.getUserEmail()); 
    if(!Objects.isNull(userWithTheSamePassword)){ 
     //if user with the same email registered already 
     return false; 
    } 
    //if user's credentials are unique 
    userDao.saveUser(user); 
    return true; 
} 

は、あなたがしなければなりません:

@RequestMapping(value = "/registrationConfirm.html",method = RequestMethod.POST) 
public ModelAndView registration(@Valid @ModelAttribute("user") User user, 
          BindingResult result){ 
    if(result.hasErrors()){ 
     return new ModelAndView("registration"); 
    } 
    if(userService.registerUser(user)){ 
     ModelAndView modelAndView = new ModelAndView("login"); 
     modelAndView.addObject("resultRegistration", "Success registration!"); 
     return modelAndView; 
    } 
    //If the other cases didn't hold true, it means the registration failed 
    ModelAndView modelAndView = new ModelAndView("registration"); 
    modelAndView.addObject("resultRegistration", 
     "User with the same login or password is registered in system already"); 
    return modelAndView; 
} 

これは読みやすく、ヌルチェックを取り除きます。このことがあなたに「良い」と感じてくれることを願っています。

+0

はい、これは私には良い感じです。 – Yuriy

+0

'UserIdOrEmail'のクエリを作成して、両方のクエリを1つのクエリで確認することもできます。あなたはそれが受け入れられるべきだと思うならば、答えを受け入れるほど親切ですか? –

+0

はい、私は1つのクエリを書くつもりです。ありがとう) – Yuriy

関連する問題