Хранить бизнес-правила в XML-документе, потом проверять на Java, как?
Пример документа XML Rules:
<user>
<username>
<not-null/>
<capitals value="false"/>
<max-length value="15"/>
</username>
<email>
<not-null/>
<isEmail/>
<max-length value="40"/>
</email>
</user>
Как мне это реализовать? Я начинаю с нуля. Сейчас у меня есть класс User и UserController, который сохраняет объект User в de DB (через слой Service и Dao-layer), базовый Spring MVC. Я не могу использовать Spring MVC Validation, однако в наших модельных классах мне нужно использовать XML-документ, чтобы администратор мог изменить правила
Я думаю, что мне нужен шаблон, который динамически строит алгоритм на основе того, что предусмотрено документом XML Rules, но я не могу думать ни о чем, кроме огромного количества операторов if.
У меня также нет ничего для анализа, и я не уверен, как я собираюсь (де) связать это с фактической реализацией процесса проверки.
2 ответа
Это колесо было изобретено много раз!
Скорее всего, вы можете использовать валидацию Spring MVC, реализуя интерфейс Spring Validator, но вам может потребоваться реализовать или найти способ обосновать валидацию на правилах, загруженных другими средствами.
Я погуглил и обнаружил много страниц, описывающих, как использовать проверку общих в Spring. В качестве бонуса некоторые описывают использование valang. Если ваш администратор может изменить правила проверки до развертывания, одного из них вполне может быть достаточно.
Если вы действительно хотите создать собственные бизнес-правила XML, вы можете проанализировать правила с помощью Apache Digester. Возможно, вы захотите загрузить правила в структуру данных, используемую вашей собственной реализацией интерфейса Spring Validator.
Если правила должны быть изменены после развертывания, вам, конечно, нужно добавить механизм для обновления правил. Но, по крайней мере, Дигестер все еще, вероятно, поможет там.
Может быть, пример будет:
//PSEUDOCODE
abstract class Validator {
Map<String method, Set<Field> fields> validationMap;
Map<String fieldName, Set<String> errorMessages> validationErrors;
void parseXML() {
validationMap.add("notNull", { " 'username', 'JavaPete' ", " 'email', 'pete@java.com' " }
validationMap.add("max-length", { " 'username', 'JavaPete', '15' ", ... }
}
void validate() {
for (String method : validationMap.keys) {
for (Field field : validationMap.get(method) ) {
invoke(method, field);
}
}
}
void notNull(Field field) {
if (field.getValue() == "") {
validationErrors.add(field.getFieldName(), "Can't be null!");
}
}
Заметьте, что я не добавил каждое свойство Set<> в Карты правильно, но здесь просто стоит подчеркнуть.
Будет ли это правильным решением? надежный?