Привет! Меня зовут Андрей Неведомский и я главный инженер в СберТехе. Я работаю в команде, которая занимается разработкой одного из системных сервисов ЕФС (Единой Фронтальной Системы). В своей работе мы активно используем Spring Framework, в частности его DI, и время от времени сталкиваемся с тем, что резолвинг зависимостей в спринге оказывается недостаточно «умным» для нас. Эта статья – результат моих попыток сделать его умнее и в целом разобраться с тем, как он работает. Надеюсь, и вы сможете узнать из неё что-то новое об устройстве спринга.
Рубрика «spring» - 7
Кастомизация резолвинга зависимостей в Spring
2019-01-08 в 6:57, admin, рубрики: java, spring, spring framework, Блог компании Сбербанк, Программирование, разработкаValidators + Aspects: кастомизируем валидацию
2018-12-04 в 12:25, admin, рубрики: aop, architecture, aspect, aspect oriented programming, java, java8, spring, spring boot, spring framework, validation, validations, validator, validators, аспект, аспектно-ориентированное, аспекты, валидация, валидация данных, ПрограммированиеДоброго времени суток!
Спустя некоторое время решил вновь написать сюда и поделиться своим опытом. На этот раз статья будет о том, как кастомизировать стандартные валидаторы, и вызывать их там, где нам будет нужно, используя Spring — аспекты. Ну а сподвигло меня на написание — практически отсутствие подобной информации, особенно на русском.
Проблема
Итак, суть приложения примерно такова: есть gateway — api, который принимает запрос, а в дальнейшем модифицирует и перенаправляет его соответствующему банку. Вот только запрос для каждого из банков отличался — как и параметры валидации. Поэтому валидировать изначальный запрос не представлялось возможным. Тут было два пути — использовать аннотации из javax.validation, либо писать свой отдельный слой валидации. В первом случае была загвоздка — по умолчанию объекты можно валидировать только в контроллере. Во втором случае так-же были минусы — это лишний слой, большое количество кода, да и в случае изменения моделей, пришлось бы менять и валидаторы.
Поэтому было принято решение найти способ дергать стандартные валидаторы там где это было необходимо, а не только в контроллере.
Дергаем валидаторы
Спустя пару часов копания в гугле были найдены пару решений, самое адекватное из которых было заавтовайрить javax.validation.Validator и вызвать у него метод validate, которому в качестве параметра нужно передать валидируемый объект.
Казалось бы, решение найдено, но автовайрить везде валидатор не казалось хорошей идеей, хотелось более элегантного решения.
Добавляем АОП
Недолго думая я решил попробовать адаптировать под это решение мною всеми любимые аспекты.
Логика была примерно следующей: создаём аннотацию, и вешаем её над методом который преобразует один объект в другой. Дальше в аспекте перехватываем все методы помеченные этой аннотацией и вызываем метод validate для возвращаемого ими значения. Профит.
Читать полностью »
Эффективное управление транзакциями в Spring
2018-11-29 в 12:14, admin, рубрики: java, spring, Блог компании Отус, Программирование, транзакцииВсем добрый день!
Что ж, конец месяца у нас всегда интенсивные, вот и тут остался всего день до старта второго потока курса «Разработчик на Spring Framework» — замечательного и интересного курса, который ведёт не менее прекрасный и злой Юрий (как его называют некоторые студент за уровень требований в ДЗ), так что давайте рассмотрим ещё один материал, который мы подготовили для вас.
Поехали.
Введение
Большую часть времени разработчики не придают значения управлению транзакциями. В результате либо большую часть кода приходится переписывать позже, либо разработчик реализует управление транзакциями без знаний того, как оно на самом деле должно работать или какие аспекты необходимо использовать конкретно в их случае.
Важный аспект в управлении транзакциями — определение правильных границы транзакции, когда транзакция должна начинаться и когда заканчиваться, когда данные должны быть добавлены в БД и когда они должны быть откачены обратно (в случае возникновения исключения).
Знакомство с Spring Data MongoDB
2018-11-20 в 11:51, admin, рубрики: java, mongodb, spring, Блог компании Отус, ПрограммированиеВсем доброго дня!
Стартовали новенький поток «Разработчик на Spring Framework», «внезапно», этот курс оказался очень востребованным среди, как и новых студентов, так и тех кто уже отучился у нас на «обычной» джаве и энтерпрайзе. Так что, если интересно, то заходите к нам на открытые уроки, ну и, разумеется, делимся интересными материалами по теме.
Поехали!
В современном мире очень важно создать и запустить приложение как можно скорее. Также приложение должно быть простым в разработке и легко поддерживаться.
Spring — как раз такой фреймворк, который обеспечивает простоту интеграции со множеством других различных фреймворков, что упрощает разработку приложения с использованием Spring. Одной из таких интеграций является интеграция Spring с MongoDB.
1. ВступлениеЧитать полностью »
Небольшая статья о том, как мы столкнулись с проблемами синхронизации работы между командами клиентской и серверной разработки. Как мы подключили Thrift для того, чтобы упростить взаимодействие между нашими командами.
Кому интересно, как мы это сделали, и какие «побочные» эффекты мы словили, прошу заглянуть под кат.
Читать полностью »
Joker 2018: невозможное возможно
2018-10-21 в 16:29, admin, рубрики: docker, java, joker, jug.ru, kotlin, microprofile, spring, Блог компании JUG.ru Group19-20 октября 2018 года в Санкт-Перербурге прошло долгожданное Java-мероприятие второй половины года — конференция Joker 2018. Подробности, впечатления, детали — всё дальше.
«Научиться Spring — бессмысленное занятие» — Джош Лонг, главный евангелист Spring о внутренней кухне проекта
2018-10-10 в 13:45, admin, рубрики: java, joker2018, spring, Блог компании JUG.ru Group, ПрограммированиеСегодня у нас в виртуальной студии самый известный в мире докладчик по Spring — Джош Лонг.
Именно его докладами открываются Java-конференции по всему миру. Именно он отвечает на вопросы сообщества, делает Spring Tips на YouTube, именно его «This week in Spring» мы читаем каждую неделю и многое другое.
Кстати, Джош разрешил использовать все материалы в нашем собственном «This week in Java», но он делает их в таком объеме и глубине, что эти данные ни разу не получилось сжать до формата «дайджеста на 15 минут».
Иногда кажется, что он находится во всех городах одновременно, читает доклады и пишет статьи в один момент. Сегодня мы будем разбираться, как это у него получается. Узнаем про «юргенизацию кода», причины удивительной живучести Spring и то, как он умудрился прожить столько лет без глобальных переписываний всего с нуля и другие интересные фишки.
Участники
Josh Long, Spring Developer Advocate at Pivotal
Евгений Трифонов, Олег Чирухин — редакция JUG.ru Group
Все мы часто пишем простые методы в контроллерах работающие через числовые идентификаторы.
@RequestMapping(value = {"/entityName/{entityId}/get"}, method = RequestMethod.GET)
@ResponseBody
public Entity get(@PathVariable(value = "entityId") Integer entityId) {
//возврат значения сущности по ID
}
Пришедший ID надо валидировать.Читать полностью »
Представляем Spring Data JDBC
2018-09-18 в 21:22, admin, рубрики: java, orm, spring, spring data, spring framework, ПрограммированиеВ предстоящий релиз Spring Data под кодовым именем Lovelace мы собираемся включить новый модуль: Spring Data JDBC.
Идея Spring Data JDBC заключается в том, чтобы предоставить доступ к реляционным базам данных без использования всей сложности JPA.
Generics + Spring: Да пребудет с вами сила
2018-09-18 в 12:00, admin, рубрики: architecture, architecture design, design patterns, generics, java, java 8, spring, spring boot, ПрограммированиеОднажды в одном далёком, далёком банке ...
Доброго времени суток. Сегодня наконец-то вновь дошли руки написать сюда. Но в отличие от предыдущих туториалов — статей сегодня хотелось бы поделиться своим опытом и показать мощь такого механизма как дженерики, который вместе с магией спринга становится ещё сильнее. Сразу хочу предупредить, что для понимания статьи нужно знать основы спринга и иметь представления о дженериках большие чем просто “Дженерики это, ну, то что в ArrayList в ковычках указываем”.
Эпизод 1:
Начнём с того, что на работе у меня стояла задача примерно таким образом: имелось большое количество денежных переводов с определенным количеством общих полей. Помимо этого каждому из переводов соответствовали классы — запросы для перевода из одного состояния в другое и перенаправления на другое апи. Соответственно были билдеры, которые и занимались преобразованием.
Проблему с общими полями я решил просто — наследованием. Таким образом у меня появились классы:
public class Transfer {
private TransferType transferType;
...
}
public enum TransferType {
INTERNAL, SWIFT, ...;
}
public class InternalTransfer extends Transfer {
...
}
public class BaseRequest {
...
}
public class InternalRequest extends BaseRequest {
...
}
...
Эпизод 2:
Дальше стояла проблема с контроллерами — у них у всех должны были быть одинаковые методы — checkTransfer, approveTransfer и тд. Вот тут то в первый, но не в последний раз мне пригодились дженерики: я сделал общий контроллер с нужными методами, и унаследовал от него остальные:
Читать полностью »