Рубрика «spring» - 11

В spring boot появилась интересная возможность собрать «исполняемый» jar файл, который также может быть init.d сервисом. То есть достаточно будет прописать символьную ссылку из /etc/init.d/myapp на jar-файл и через update-rc.d настроить автозапуск сервиса. Технически jar файл становится bash-скриптом в конце которого находятся бинарные данные.

Описание данной возможности: docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

Изучая скрипт файл, я обнаружил некоторые проблемы с безопасностью.
Читать полностью »

Вместо дисклеймера

На Хабре уже есть множество статей на тему работы с Hibernate, однако, как мне показалось, все они довольно сложные для новичков. Эта статья направлена на разъяснение основ работы с ORM и будет полезна в первую очередь тем, кто только начинает разрабатывать собственные приложения и имеет мало опыта работы с базами данных в общем, и с инструментами, вроде Hibernate, в частности. Матерые разработчики вряд ли найдут в статье для себя что-то новенькое; всех остальных прошу под кат.
Читать полностью »

В этой статье я расскажу о нашей реализации hot deploy — быстрой доставки изменений Java-кода в работающее приложение.

Для начала немного истории. Мы уже несколько лет делаем корпоративные приложения на платформе CUBA. Они очень разные по размеру и функциональности, но все они похожи в одном — в них много пользовательского интерфейса.

В какой-то момент мы поняли, что разрабатывать пользовательский интерфейс, постоянно перезагружая сервер — крайне утомительно. Использование Hot Swap сильно ограничивает (нельзя добавлять и переименовывать поля, методы класса). Каждая перезагрузка сервера отнимала минимум 10 секунд времени, плюс необходимость повторного логина и перехода на тот экран, который ты разрабатываешь.

Пришлось задуматься о полноценном hot deploy. Под катом — наше решение проблемы с кодом и демо-приложением.
Читать полностью »

Продолжаем цикл статей — переводов по Spring и Hibernate, от krams.

Предыдущая статья:
«Spring MVC 3, Аннотации Hibernate, MySQL. Туториал по интеграции».

Введение.
В этом уроке мы познакомимся с использованием отношения один ко многим, используя аннотации Hibernate и Spring MVC 3. Мы будем использовать аннотоцию @OneToMany для указания отношений между нашими объектами. Мы не будем использовать каскадные типы или fetch-стратегии, вместо этого мы воспользуемся стандартными настройками @OneToMany.

Что такое ассоциация один-ко-многим?
Ассоциация один-ко-многим возникает тогда, когда каждой записи в таблице А, соответствует множество записей в таблице Б, но каждая запись в таблице Б имеет лишь одну соответствующую запись в таблице А.

Спецификация нашего приложения.

Приложение является простой CRUD системой управления списком записей. Каждая запись соответствует одному лицу, она содержит персональные данные и данные о кредитной карте. Каждое лицо может владеть несколькими кредитками. Так же мы добавим систему редактирования лиц и кредиток.

Ниже приведены скриншоты из будущего приложения:

Spring — Hibernate: ассоциация один ко многим - 1
Читать полностью »

Не так давно я начал изучать фреймворк Spring и понял, что количество материала на русском языке ограниченно буквально парой стоящих статей. По быстрому пробежав, я захотел сделать что-то более интересное, но с наскоку взять не удалось. Пришлось погуглить по поводу нескольких вопросов касательно взаимодействия Spring и Hibernate. Неожиданно я наткнулся на блог достаточно интересного разработчика Mark Serrano aka krams. Теперь вместе с вами я хотел бы начать цикл статей-переводов, а так же свое обучение в мире Spring.

Приступим…
Читать полностью »

Описание проблемы

Пусть у нас есть некоторый класс X, параметризующийся из контейнера свойств PX и есть класс Y, расширяющий X, параметризующийся контейнером PY, расширяющим PX.

Если контейнерами свойств выступают аннотации, то мы имеем два класса:

@PX(propertyX1 = <valueX1>, ..., propertyXN = <valueXN>)
class X {
...
}

И есть класс:

@PY(propertyY1 = <valueY1>, ..., propertyYN = <valueYN>)
class Y extends X {
...
}

Java (в том числе и Java 8) не предоставляют возможность наследования аннотаций, поэтому написать что-то вроде примера ниже нельзя:

public @interface PX extends PY {
}

Разумеется, это не проблема, вот решение:

@PX
class X {

  protected final ... propertyX1;
  ...
  protected final ... propertyY1;

  X() {
    final PX px = getClass().getAnnotation(PX.class);
    propertyX1 = px.propertyX1();
    ...
    propertyXN = px.propertyXN();
  }
}

@PY
class Y extends X {

   Y() {
      final PY py = getClass().getAnnotation(PY.class);
      propertyY1 = px.propertyY1();
      ...
      propertyYN = px.propertyYN();
   }
}

В чем здесь недостаток? Недостаток в том, что мы обрекаем себя на то, что если у класса не будет аннотаций, то он будет сконфигурирован дефолтными значениями (аннотации PX и PY должны быть @Inherited для этого).

Как быть, если нам, к примеру, надо инжектировать проперти из файла .properties или взять их из какого-либо другого источника, например из спрингового Environment?

Если не прибегать к изощренным трюкам типа создания аннотированных классов «на лету» с подстановкой параметров аннотаций, то ничего.
Читать полностью »

Пример работы магии Spring Boot, Spring Data JPA и аудита сущностей.

Хотя вся конфигурация будет описана в классах с использованием Java Config, в приложении есть файл application.properties. Используется он потому, что эти настройки Spring Boot подхватывает на самой ранней стадии инициализации, а некоторые дефолтные настройки стоит заменить.

В качестве базы данных будем использовать H2 Database Engine.

По-умолчанию Spring Boot для Spring Data JPA при подключении драйвера базы данных HSQL, H2 или Derby создаёт DataSource с in-memory базой данных и инициализирует её файлами schema.sql и data.sql из ресурсов приложения. Также по умолчанию используется hibernate.hbm2ddl.auto=create-drop, после чего мы получаем девственно чистую базу данных с таблицами, сгенерированными из сущностей. Зачем так сделано — загадка, но эту автогенерацию надо отключить параметром в файле application.properties: spring.jpa.hibernate.ddl-auto=none

Также помимо DataSource Spring Boot любезно создаст и EntityManagerFactory, который найдёт сущности в любом месте приложения.
Читать полностью »

По следам Spring Pet Clinic. Maven  Spring Context  Spring Test  Spring ORM  Spring Data JPA
Здравствуйте!
Spring MVC, согласно обзору инструментов и технологий Java за 2014 г. от RevbelLabs, является самым популярным веб фреймворком. Далее тот же обзор называет лидера ORM — Hibernate и лидера веб-контейнеров — Apache Tomcat. Добавим сюда самую используемую java script библиотеку jQuery, самый популярный css фреймворк Bootstrap, до сих пор самую популярную (несморя на наступление Gradle) инструмент сборки Maven, абсолютный лидер среди тестовый фреймворков JUnit и получим пример приложения на Spring от его создателей: Spring Pet Clinic (демо приложение). Кроме перечисленного, в этот достаточно несложный по функциональности проект влючены также Spring-Jdbc, Spring-ORM, Spring Data JPA, Hibernate Validator, SLF4J, Json Jackson, JSP, JSTL, WebJars, Dandelion DataTables, HSQLDB, Hamcrest, Mockito и десятки других зависимостей.
Читать полностью »

Как известно, в Spring нельзя сделать бины для перечисляемых типов без «костылей» — у этого типа «нет» конструктора.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demoEnum0' defined in file [...DemoEnum0.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [ru.itbasis.demo.spring.enums.DemoEnum0]: No default constructor found; nested exception is java.lang.NoSuchMethodException: ru.itbasis.demo.spring.enums.DemoEnum0.<init>()

(коммит)

В данном посте я попробую обойти это ограничение.
Читать полностью »

Внесу и свой вклад в тренд темного программирования.
Многим из вас знакома дилемма: использовать ли DI в своем проекте или нет.
Поводы перехода на DI:

  • создание развитой системы авто-тестов
  • повторное использование кода в различном окружении, в том числе в различных проектах
  • использование 3rd-party библиотек, построенных на DI
  • изучение DI

Доводы не использовать DI:

  • усложнение понимания кода (поначалу)
  • необходимость конфигурирования контекста
  • изучение DI

Допустим, у нас есть большой рабочий проект, принято решение: переводить на DI. Разработчики чувствуют свой потенциал, уровень мидихлориан в крови зашкаливает.
Перевод legacy проекта на Dependency Injection. Путь Ситха
Путь тебя ждет тернистый и долгий, мой юный падаван.

Если проект большой и в нем много разработчиков, одним коммитом вряд ли удастся сделать такой рефакторинг. Поэтому мы используем несколько плохих практик, упростив переход, а затем от них избавимся.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js