Я использую apache CXF.Использование дженериков во время проверки
Для публикации контакта используется следующий API.
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
ResponseResult create(@Context HttpHeaders httpHeaders, @Context Request request, @Context UriInfo uriInfo,
UserContact contact) throws MDMException;
Здесь класс UserContact содержит контактную информацию о пользователе, который передается как JSON в теле.
Мне нужно сделать некоторые бизнес-проверки для этого объекта UserContact. Но мне не нравится иметь слишком много кода проверки, упакованного в один класс.
Я хотел бы сделать что-то вроде следующего. Но я сталкиваюсь с проблемой с Generics.
interface Rule<S>
{
void applyRule(S s)throws Exception;
}
interface Validatable
{
void validate() throws Exception;
}
public class MyValidator
{
private HashMap<? extends Rule ,?> map = new HashMap<>();
public void validate() throws Exception
{
for(Rule rule : map.keySet())
{
rule.applyRule(map.get(rule));
}
}
public <S> void addRule(Rule<S> rule, S data)
{
this.map.put(rule, data);
}
}
class EMailValidationRule implements Rule<String>
{
private static final Pattern emailPattern = Pattern.compile("email-regex");
public void applyRule(String s) throws Exception
{
if(!emailPattern.matcher(s).matches())
throw new Exception("Not a valid EMail");
}
}
Так UserContact должен сделать следующее для своих целей проверки. Это обеспечивает компактность кода (IMO).
class UserContact implements Validatable
{
// some
// code
// related to User Contact
public void validate() throws Exception
{
MyValidator validator = new MyValidator();
validator.addRule(new EMailValidationRule(), "[email protected]");
validator.addRule(new PhoneValidationRule(), "+1234567890");
validator.validate();
}
}
Я получаю ошибки как:
метод положить (? Захвата # 5-оф распространяется правило, захват # 6-в) в типа HashMap не применяется для аргументов (Правило , S)
Также представленная конструкция подходит для проведения валидации?
'вы перезаписать данные, которые были уже there.' только если правила равны, это все-таки «HashMap». Может быть полезно отделить правила проверки для одного и того же типа данных. Таким образом, одно правило может проверять шаблон электронной почты, а второй может гарантировать, что он не является дубликатом. С вашим кодом будет доступен только один. Это не обязательно то, что было запрошено. – Obicere
@Obicere '' 'Может быть полезно отделить правила проверки для одного и того же типа данных''', это все еще возможно. У вас есть класс '' 'EMailvalidationRule реализует правило' '', а другой класс '' 'AnotherValidationRule реализует правило ' ''. Они - разные ключи, поэтому у вас все еще есть и то, и другое. –
Ваша первая точка поднимает интересный момент, вы не можете иметь 2 экземпляра правил того же типа, которые выполняют разные вещи (например, из-за разных полей экземпляра). Я взял из кода OP, что намерение состояло в том, чтобы иметь 1 экземпляр правила для каждого типа правила, но это также является слабым местом. См. Обновленный ответ –