Архивы рубрики: Java

Нужно написать интеграционный тест для тестирования обработки входящих в топик сообщений. Для этого нужно будет настроить тестовый контекст таким образом, чтобы поднимался встроенный JMS-сервер, через который осуществлялось бы взаимодействие. Буду рассматривать приложение, описанное в первой статье: https://blog.knasys.ru/1-jms-ibm-mq-pub-sub/ Я не нашел информации о том можно ли встроить IBM MQ в приложение, поэтому встраивать будем ActiveMQ (он так умеет точно =) ), а поскольку он тоже является реализацией JMS, то проблем быть не должно. Для начала нам понадобится зависимость: Далее, для тестового профиля, нам следует отключить бины внутри основной конфигурации, которые настраивают связь с сервером IBM MQ, т.е. над бинами ru.knastnt.springjmsibmmq.config.IbmMqConfiguration.MQConfigurationProperties и ru.knastnt.springjmsibmmq.config.IbmMqConfiguration.MQConnectionFactory поставить аннотацию @Profile(«!test») Теперь создадим родительский класс для всех интеграционнах тестов, в котором опишем все требования к контексту. Сразу после добавления зависимости, в приложении будет стартовать встроенный брокер сообщений Acrive MQ, осталось только добавить ConnectionFactory для создания подключения к нему (называться он должен так же как и ConnectionFactory для…

Читать дальше

Для начала нам понадобится сервис IBM MQ. Поднимаем его локально с помощью Docker. Для этого выполним команду в консоли: В результате скачается и запустится образ. Будут проброшены 2 порта — 11414 (для взаимодействия с MQ) и 9443 (web-интерфейс).Web-интерфейс поднимется не сразу, у меня он начинает работать только минуты через 4 после запуска контейнера. До этого то соединение сброшено, то ошибка установки защищённого соединения, то неожиданный ответ. В итоге, когда web-интерфейс — таки поднимется, зайти в него можно используя логин и пароль Подключение к web: https://localhost:9443/Логин/пароль: admin passw0rd Настройки по умолчанию: Имя администратора очередей: QM1Канал: DEV.ADMIN.SVRCONN Внутри Web-интерфейса можно ничего не делать. Теперь нам нужно будет иметь возможность кидать тестовые сообщения (например, в web-интерфейсе я не нашёл возможности этого делать). Поэтому устанавливаем программу MQ Explorer View. Установка MQ Explorer View:https://www.ibm.com/docs/en/ibm-mq/9.1?topic=windows-installing-stand-alone-mq-explorerДля скачивания нужно будет зарегистрироваться на сайте. В итоге у меня скачался файл 9.1.5.0-IBM-MQ-Explorer-Win64.zip размером около 400Мб. Установка не вызывает затруднений. Но…

Читать дальше

Type specified for TypedQuery [ru.knastnt.app.MyClass] is incompatible with query return type [class ru.knastnt.app.MyClass] Такое случается при дебаге и решается с путём исключения из pom.xml зависимости spring-boot-devtools. Can’t load camunda cockpit with error in console: It was not able to load the following file ‘app/plugin.js’ Проблема описана здесь https://jira.camunda.com/browse/CAM-10738 и решением является: — либо запуск с использованием Shorten command line: — либо удаление из .idea/workspace.xml строки <property name=»dynamic.classpath» value=»true» /> @JsonAnySetter not works. @JsonAnySetter не работает на вложенных объектах. С этой проблемой я мучился несколько дней! Оказалось, что при объявлении переменной помеченной аннотацией @JsonAnySetter , её нужно обязательно инициализировать! =) Диблирующиеся значения в списке @OneToMany Воспроизводится при EAGER загрузке. Предлагают заменить List на Set: https://stackoverflow.com/questions/20749806/duplicates-in-onetomany-annotated-list Почему не стоит делать JUnit тесты транзакционными У меня давно сформировалось такое мнение, но причины этого как-то уже позабылись. Буду пытаться восстановить их здесь: Могут быть проблемы с отношениями одинКоМногим, МногиеКоМногим из-за того, что изменения не…

Читать дальше

Не буду разжевывать то что и так везде разжевано, просто запишу тут некоторые вещи. Если нужно управлять ченджсетами вне контекста java-приложения, то это можно сделать непосредственно через утилиту liquibase.exe. Для начала нужно установить liquibase на компьютер.Затем добавить в директорию lib драйвер postgre-jdbc (желательно версии не ниже 9.6, а то будут потом проблемы).Затем запускать из директории проекта. Применение файла _.xml (если это обновление уже применено, то второй раз уже не применяется): При этом история применения обновлений сохраняется в двух служебных таблицах: databasechangelog и databasechangeloglock. Вместо update можно применять другие команды: history — показать историю обновлений (https://docs.liquibase.com/commands/community/history.html) rollbackCount 1 — откатить одно последнее обновление (https://docs.liquibase.com/workflows/liquibase-community/using-rollback.html?Highlight=rolling%20back) updateTestingRollback — тот же update, но с тестированием отката. Но работает странно: не следит что база сохраняет консистентность В качестве тестового файла можете использовать этот: Если мы сделаем update этому файлу, то по порядку каждый ченджсет применится (если только уже не был применен). При этом в истории…

Читать дальше

Файл application.properties Большой список всевозможных свойств и описаний к ним Получение значения параметра свойства Надо пометить переменную наподобие такого RestTemplate send PATCH request При попытке отправить PATCH запрос, возникает исключение ProtocolException: Invalid HTTP method: PATCH или ResourceAccessException: I/O error on PATCH request Для решения проблемы следует добавить зависимость: И создавать RestTemplate следующим образом: Spring инициализация Запуск своего кода при загрузке Spring i18n Internalization Поддержка языков при использовании Spring Boot. Достаточно определить бин: И разместить бандлы в указанном месте (locale/messages/app). Т.е.: src/main/resources/locale/messages/app.properties иsrc/main/resources/locale/messages/app_ru.properties В этом случае если браузер желает русскую локаль, то ему будет отдан app_ru.properties, в противном случае — app.properties Также можно переопределить логику определения текущей локали с помощют объявления бина : Если этого не сделать SpringBoot будет использовать org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver.classв нём можно ставить брейкпоинты. Таким образом, если не переопределять LocaleResolver, то локаль будет определяться их хэдеров запроса. Более подробно написано тут https://blog.knasys.ru/spring-boot-i18n-thymeleaf/ Аннотации Как переиспользлвать настроенную аннотацию @Pattern Если Вы…

Читать дальше

12345678910111213141516171819202122232425import java.lang.reflect.Method; public class test {     public static class Cat{         void say(String word){             System.out.println("Cat says: " + word);         }     }     public static void main(String[] args) {         Cat cat = new Cat();         cat.say("hello");         System.out.println(isHasMethod(cat, "say"));     }     static boolean isHasMethod(Object object, String methodName){         Method[] methods = object.getClass().getDeclaredMethods();         for (Method method : methods) {             if (method.getName().equals(methodName)) return true;         }         return false;     } }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import javax.mail.*; import javax.mail.internet.*; import java.util.Properties; public class test {     public static void main(String[] args) {         //Отправить E-Mail         //Скачать javamail api (javax.mail.jar) отсюда http://www.oracle.com/technetwork/java/javamail/index.html         //В Intellij IDEA в меню File->Project Structure…->Libraries нажать плюсик и добавить этот файл к проекту         //Тто же самое сделать для JAF (activation.jar): http://www.oracle.com/technetwork/java/javase/jaf-136260.html         //Если что-нибудь не получается, возможно сам почтовик блокирует авторизацию через ненадёжные приложения. (так по-умалчанию делает gmail.com и это отключается в личном кабинета)         final String username = "SOURCE@mail.ru";         final String password = "SOURCE_PASSWORD";         Properties props = new Properties();         props.put("mail.smtp.auth", "true");         props.put("mail.smtp.starttls.enable", "true");         props.put("mail.smtp.host", "smtp.mail.ru");         props.put("mail.smtp.port", "587");         Session session = Session.getInstance(props,…

Читать дальше

1234567891011121314151617import java.util.Arrays; import java.util.Comparator; public class test {     static class MyComparator implements Comparator<String> {         public int compare(String strA, String strB) {             return strB.compareTo(strA);         }     }     public static void main(String[] args) {         String[] mass = new String[]{"hello", "world", "any_shit", "my_word"};         MyComparator rsc = new MyComparator();         Arrays.sort(mass, rsc);         System.out.println(Arrays.toString(mass));     } }

При сериализации автоматически не сериализуются: — transient переменные — static переменные — унаследованные переменные (они будут инициализированы с помощью конструктора родительского класса без параметров). Все это можно разными способами сериализовать врукопашную (externalizable). Для сериализации объектов внутренних нестатических классов, внешние классы должны быть сериализуемыми. Да, чтобы немного дополнить алгоритм стандартной сериализации/десериализации, используют два метода: 1234567891011121314151617181920public class B extends A implements Serializable {         private String nameB;         private void writeObject(ObjectOutputStream oos) throws Exception{             oos.defaultWriteObject();             oos.writeObject(nameA);         }         private void readObject(ObjectInputStream ois) throws  Exception{             ois.defaultReadObject();             nameA = (String) ois.readObject();         }         public B(String nameA, String nameB) {             super(nameA);        …

Читать дальше

1MyClass.class.getPackage().getName()

20/25