Утверждение объектов Java в spring без аннотаций

Я использую MyBatis для всех действий, которые подразумевают взаимодействие с базой данных. Также я работаю с Angularjs для frontend, так что утверждения в клиенте делаются с angular-validation-ghiscoding и с родными утверждениями html5. Мне хотелось бы санкционировать данные также в bankend, но не используя аннотаций.

Здесь есть пример кода:

@RequestMapping(value = SecureApiResources.URI_UPDATE_ACCOUNT, method = RequestMethod.POST, produces = "application/json")
    public @ResponseBody Account updateAccount(
            @RequestBody final AccountRequestUpdate accountRequest) { // Object to be validated (accountRequest)

        Account account = accountMapper.getAccountOfMerchant(authContextHolder.getMerchantId(), authContextHolder.getDefaultAccountId());

        if (account == null) {
            HttpErrors httpErrors = new HttpErrors(
                    SecureApiResources.ERROR_ACCOUNTS_NOT_FOUND);
            throw new EntityNotFoundException(httpErrors);
        }
        int resultUpdate;
        try {
            // In this point I should validate the accountRequest object
            account.setAccountName(accountRequest.getAccountName());
            account.setCommercialName(accountRequest.getCommerciaName());
            account.setCountry(accountRequest.getCountry());
            account.setCity(accountRequest.getCity());
            resultUpdate = accountMapper.updateMerchant(account);
            if (resultUpdate == 0) {
                HttpErrors httpErrors = new HttpErrors(
                        SecureApiResources.ERROR_ACCOUNTS_NOT_FOUND);
                throw new EntityNotFoundException(httpErrors);
            }
        } catch (Exception e) {
            HttpErrors httpErrors = new HttpErrors(
                    SecureApiResources.ERROR_SQL_NOT_EXECUTE);
            throw new EntityNotFoundException(httpErrors);
        }

        return account;
    }

В том же классе у меня есть метод, чтобы создавать счет и я получаю другой объект модели (AccountRequestCreate accountRequest).

Каковым может быть лучший выбор, который нужно осуществлять, не используя даже не аннотаций xml?

3
задан 04.03.2016, 23:09
2 ответа

Если ты не хочешь использовать ни XML ни аннотации, у тебя есть 2 выбора:

  • создавать класс utilerГ - в
  • наделять в твои классы сеттеров validadores

Класс utilleria:

, Когда использование эта техника, я верю одновременно в исключение, настроенное, чтобы контролировать все ошибки возможно и возвращать сообщение, обнаруженное в случае интернационализированных приложений:

public class MyValidator {

    public static void validateAccountRequest(AccountRequestUpdate accountRequest) 
        throws MyI18NException 
    {
        // aqui validas los campos necesarios
    } 
}

Исключение должно быть чем-либо подобным:

public class MyI18NException extends Throwable implements Serializable {
    public MyI18NException (String errorMsg) {
        // traducimos el codigo de error 
        String localizedMessage = datasource.get(errorMsg);
        // acciones propias
        super(localizedMessage);
    }
}

И чтобы это использовать:

try {
    // In this point I should validate the accountRequest object
    MyValidator.validateAccountRequest(accountRequest);
    account.setAccountName(accountRequest.getAccountName());
    account.setCommercialName(accountRequest.getCommerciaName());
    account.setCountry(accountRequest.getCountry());
    account.setCity(accountRequest.getCity());
    resultUpdate = accountMapper.updateMerchant(account);
    if (resultUpdate == 0) {
        HttpErrors httpErrors = new HttpErrors(
                SecureApiResources.ERROR_ACCOUNTS_NOT_FOUND);
        throw new EntityNotFoundException(httpErrors);
    }
} catch (MyI18NException e) {
    // maneja el error como necesites
} catch (Exception e) {
    HttpErrors httpErrors = new HttpErrors(
            SecureApiResources.ERROR_SQL_NOT_EXECUTE);
    throw new EntityNotFoundException(httpErrors);
}

Сеттеров validadores:

, Хотя этот выбор я рекомендую ее тебе меньше, ты можешь использовать ассигнования в признаки Account, чтобы санкционировать данные, которые приходят к тебе front , они правильны создавая setters, которые возвращали бы boolean или бросали исключения:

ЗАМЕЧАЕТ: этот одинокий случай служи, если ты не сохраняешься AccountRequestUpdate прямо но ты используешь данные для того, чтобы создать другие объекты.

Санкционируя:

public boolean setAttribute(String attribute) {
   if(Utils.notNullOrEmpty(attribute) && attribute.contains("cadena_obligatoria")) {
       this.attribute = attribute;
       return true;
   }
   return false;
}

Бросая excepciГіn:

public void setAttribute(String attribute) throws MyI18NException {
   if(Utils.notNullOrEmpty(attribute) && attribute.contains("cadena_obligatoria")) {
       this.attribute = attribute;
   } else {
       throw new MyI18NException("Empty.String");
   }    
}
1
ответ дан 24.11.2019, 14:46

Хорошая идея состоит в том, чтобы использовать интерфейс Валидатор де Спринг, это отмечать как Component (bean spring) так ты можешь делать инъекцию этому и использовать ее, когда ты будешь нуждаться в ней, с одной стороны чисто и из-за другой, находится в соответствии с книжными магазинами Спринг Фрэмеуорк.

Пример осуществления - следующий:

public class UserLoginValidator implements Validator {

    private static final int MINIMUM_PASSWORD_LENGTH = 6;

    public boolean supports(Class clazz) {
       return UserLogin.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
       ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required");
       ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required");
       UserLogin login = (UserLogin) target;
       if (login.getPassword() != null
             && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) {
          errors.rejectValue("password", "field.min.length",
                new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)},
                "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length.");
       }
    }
 }

Ты можешь encontar больше информации в следующих enlacs:

  • Официальная документация Спринг различных типов утверждений, которые они предлагают, как ты видишь, находит пример, который я предлагаю тебе: ссылка.
  • Маленький путеводитель с примерами как осуществлять validator и использовать это: ссылка
0
ответ дан 24.11.2019, 14:46