使用 Validator
针对我们需要验证的特定数据类型,在将 Validator 置于适当位置并对它作设置之后,在应用程序中使用它就很容易,在我们的业务委派方法中尤其如此。清单 3 中重写了上一篇技巧文章中的委派,以使它能使用新的 Validator 类。
清单 3. 业务委派中的数据格式验证
1 package com.ibm.library;
2 import java.rmi.RemoteException;
3 import java.util.Iterator;
4 import java.util.List;
5 import javax.ejb.CreateException;
6 import javax.naming.NamingException;
7 import com.ibm.validation.Validator;
8 import com.ibm.validation.InvalidDataException;
9 public class LibraryDelegate implements ILibrary {
10 private ILibrary library;
11 public LibraryDelegate() {
12 init();
13 }
14
15 public void init() {
16 // Look up and obtain our session bean
17 try {
18 LibraryHome libraryHome =
19 (LibraryHome)EJBHomeFactory.getInstance().lookup(
20 "java:comp/env/ejb/LibraryHome", LibraryHome.class);
21 library = libraryHome.create();
22 } catch (NamingException e) {
23 throw new RuntimeException(e);
24 } catch (CreateException e) {
25 throw new RuntimeException(e);
26 } catch (RemoteException e) {
27 throw new RuntimeException(e);
28 }
29 }
30
31 // No validation required for accessor (getter) methods
32
33 public boolean checkout(Book book) throws ApplicationException {
34 // No validation required here; the object type
35 // takes care of it
36
37 try {
38 return library.checkout(book);
39 } catch (RemoteException e) {
40 throw new ApplicationException(e);
41 }
42 }
43
44 public boolean checkout(List books) throws ApplicationException {
45 // Validate list
46 Validator.validateList(books, Book.class);
47
48 try {
49 return library.checkout(books);
50 } catch (RemoteException e) {
51 throw new ApplicationException(e);
52 }
53 }
54
55 public Book lookup(String isbn) throws ApplicationException {
56 // Validate ISBN
57 Validator.validateISBN(isbn);
58
59 try {
60 return library.lookup(isbn);
61 } catch (RemoteException e) {
62 throw new ApplicationException(e);
63 }
64 }
65
66 // And so on...
67
68 public void destroy() {
69 // In this case, do nothing
70 }
71 }
72
2 import java.rmi.RemoteException;
3 import java.util.Iterator;
4 import java.util.List;
5 import javax.ejb.CreateException;
6 import javax.naming.NamingException;
7 import com.ibm.validation.Validator;
8 import com.ibm.validation.InvalidDataException;
9 public class LibraryDelegate implements ILibrary {
10 private ILibrary library;
11 public LibraryDelegate() {
12 init();
13 }
14
15 public void init() {
16 // Look up and obtain our session bean
17 try {
18 LibraryHome libraryHome =
19 (LibraryHome)EJBHomeFactory.getInstance().lookup(
20 "java:comp/env/ejb/LibraryHome", LibraryHome.class);
21 library = libraryHome.create();
22 } catch (NamingException e) {
23 throw new RuntimeException(e);
24 } catch (CreateException e) {
25 throw new RuntimeException(e);
26 } catch (RemoteException e) {
27 throw new RuntimeException(e);
28 }
29 }
30
31 // No validation required for accessor (getter) methods
32
33 public boolean checkout(Book book) throws ApplicationException {
34 // No validation required here; the object type
35 // takes care of it
36
37 try {
38 return library.checkout(book);
39 } catch (RemoteException e) {
40 throw new ApplicationException(e);
41 }
42 }
43
44 public boolean checkout(List books) throws ApplicationException {
45 // Validate list
46 Validator.validateList(books, Book.class);
47
48 try {
49 return library.checkout(books);
50 } catch (RemoteException e) {
51 throw new ApplicationException(e);
52 }
53 }
54
55 public Book lookup(String isbn) throws ApplicationException {
56 // Validate ISBN
57 Validator.validateISBN(isbn);
58
59 try {
60 return library.lookup(isbn);
61 } catch (RemoteException e) {
62 throw new ApplicationException(e);
63 }
64 }
65
66 // And so on...
67
68 public void destroy() {
69 // In this case, do nothing
70 }
71 }
72
使用独立的 Validator 使代码更模块化和更易维护。另外,我们已将所有的验证逻辑移至一处,从而避免代码中出现冗余。其结果是一个更佳、更不易出错的应用程序。