2016-10-30 218 views
1

我需要您的幫助!在我的web項目(它基於Spring MVC)我使用異常來表明一些驗證失敗,但我不知道這樣做是否正確。服務驗證:如果驗證失敗,則拋出異常

,比如我有這樣的服務:

@Service 
@Transactional 
public class UserService { 

@Autowired 
private UserRepository userRepository; 

public User createUser(UserDTO userDTO) throws IllegalArgumentExceptio { 
    validateUserEmail(userDTO); 
    return userRepository.save(new User(userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail(), userDTO.getPassword())); 
} 

private void validateUserEmail(UserDTO userDTO) throws IllegalArgumentException { 
     String emailPattern = "^[a-z0-9-\\+]+(\\.[a-z0-9-]+)*@" 
       + "[a-z0-9-]+(\\.[a-z0-9]+)*(\\.[a-z]{2,})$"; 

     if (userDTO() == null) { 
      throw new IllegalArgumentException(INVALID_EMAIL_NULL.getMessage()); 
     } else if (userDTO().length() > 25) { 
      throw new IllegalArgumentException(INVALID_EMAIL_LENGTH.getMessage()); 
     } else if (!userDTO().matches(emailPattern)) { 
      throw new IllegalArgumentException(INVALID_EMAIL_FORMAT.getMessage()); 
     } 
    } 
} 

我讀過這個article。另外我知道還有一種方法是使用Hibernate Validator。

所以,主要問題是:哪一種方法是最佳實踐,爲什麼?

  1. 在驗證過程中拋出異常,與我一樣。
  2. 使用類似notification pattern的東西。
  3. 使用Hibernate驗證器。
+0

我的回答有幫助嗎? – developer

+0

@javaguy是的,它幫助了我。謝謝 – TimurJD

回答

1

很明顯,使用Bean驗證的Hibernate驗證器,這是現成的庫是最好的方法,因爲我們不需要爲最小長度/最大長度等重寫大量代碼。另外,如果您自己重寫最小長度/最大長度驗證的邏輯,您需要進行廣泛的測試以確保寫入的代碼是正確的,這是必須的。拇指規則,如果已經有一些可信的代碼,不要試圖重新發明/重寫,而只是利用它,這就是所謂的DRY(不要重複自己)原理,非常重要任何編程

0

這是一個非常糟糕的主意。我想到的解決方案之一就是:如果您的電子郵件驗證失敗,您將如何通知用戶?我會去custom validation annotation。如果郵件驗證失敗,您只需返回false。採用這種方法,如果電子郵件驗證失敗,您還可以輕鬆通知用戶,因爲簡單地說,BindingResult將包含錯誤。此外,另一個好處是錯誤消息的本地化。所以是的,Hibernate validatior是要走的路。