{"id":462324,"date":"2025-06-07T09:00:30","date_gmt":"2025-06-07T09:00:30","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=462324"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=462324","title":{"rendered":"<span>\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043e\u0432\u044b\u0439 \u044d\u043d\u0442\u0435\u0440\u043f\u0440\u0430\u0439\u0437<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043f\u0440\u0438\u0433\u043e\u0440\u043e\u0434\u0435 \u0434\u0430\u043b\u0435\u043a\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D1%8C%D1%8E-%D0%94%D0%B5%D0%BB%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041d\u044c\u044e-\u0414\u0435\u043b\u0438<\/a> \u0436\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0435\u043d\u0435\u043a \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442. \u041b\u044e\u0431\u0438\u043b \u043e\u043d \u043c\u0430\u043c\u0443, \u041a\u0440\u0438\u0448\u043d\u0443 \u0438 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u043c\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c\u0438 \u0433\u0440\u0438\u0431\u0430\u043c\u0438. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3d0\/df8\/bda\/3d0df8bda047d404a12eba22dcea68dc.jpeg\" alt=\"\u0422\u0440\u0438 \u0433\u0440\u0430\u043d\u0438 \u0431\u0435\u0437\u0443\u043c\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.\" title=\"\u0422\u0440\u0438 \u0433\u0440\u0430\u043d\u0438 \u0431\u0435\u0437\u0443\u043c\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3d0\/df8\/bda\/3d0df8bda047d404a12eba22dcea68dc.jpeg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3d0\/df8\/bda\/3d0df8bda047d404a12eba22dcea68dc.jpeg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0438 \u0433\u0440\u0430\u043d\u0438 \u0431\u0435\u0437\u0443\u043c\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0441\u043e\u0431\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u043d\u0438\u0440\u0432\u0430\u043d\u0443, \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0439 \u0433\u0440\u0438\u0431 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u043c\u0443 \u043f\u0430\u0440\u0435\u043d\u044c\u043a\u0443 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u043e\u0436\u0434\u0435\u043d \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u00a0\u0431\u044b\u043b \u0440\u0430\u0434\u0438 \u0432\u0435\u043b\u0438\u043a\u043e\u0439 \u0446\u0435\u043b\u0438: <\/p>\n<blockquote>\n<p>\u043c\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u043b\u044b\u043c \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u043c \u0437\u0430\u00a0\u0433\u043e\u0434\u044b \u0440\u0430\u0431\u0441\u0442\u0432\u0430 \u0438\u00a0\u0443\u0433\u043d\u0435\u0442\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0440\u043e\u0434\u0430.<\/p>\n<\/blockquote>\n<p>\u2014\u00a0\u041e\u00a0\u044e\u043d\u044b\u0439 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442! \u2014\u00a0\u043c\u043e\u043b\u0432\u0438\u043b \u0433\u0440\u0438\u0431. <\/p>\n<p>\u2014\u00a0\u041f\u043e\u043c\u043d\u0438 \u0447\u0442\u043e \u00ab\u0432\u0435\u0440\u0430 \u0431\u0435\u0437 \u0434\u0435\u043b \u043c\u0435\u0440\u0442\u0432\u0430\u00bb. \u0411\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u00a0\u2014\u00a0\u0412\u0440\u0430\u0433 \u0445\u0438\u0442\u0435\u0440 \u0438\u00a0\u043a\u043e\u0432\u0430\u0440\u0435\u043d, \u0441\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u0439\u043d\u043e \u0438\u00a0\u0435\u0433\u043e\u00a0\u0436\u0435 \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<p>\u041f\u0440\u043e\u0448\u043b\u0438 \u0433\u043e\u0434\u044b, \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f. <\/p>\n<p>\u041f\u0430\u0440\u0435\u043d\u0435\u043a \u0432\u044b\u0443\u0447\u0438\u043b \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0412\u0423\u0417 \u0438\u00a0\u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u00a0\u043a\u0440\u0443\u043f\u043d\u0443\u044e \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u00ab\u0431\u0435\u043b\u044b\u0435 \u0432\u0430\u0440\u0432\u0430\u0440\u044b\u00bb \u0438\u0437 \u0434\u0430\u043b\u0435\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0437\u0430\u00a0\u043e\u043a\u0435\u0430\u043d\u043e\u043c \u0437\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041d\u043e\u00a0\u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u043b \u0445\u0440\u0430\u0431\u0440\u044b\u0439 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u00a0\u2014 \u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u044b\u043d \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0440\u043e\u0434\u0430 \u043d\u0430\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0433\u043e \u0433\u0440\u0438\u0431\u0430 \u0438\u00a0\u0434\u043e\u0441\u043b\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u0434\u043e\u00a0\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 <strong>\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u0430<\/strong> \u043d\u0430\u0447\u0430\u043b \u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0436\u0435\u0441\u0442\u043e\u043a\u0443\u044e \u043c\u0435\u0441\u0442\u044c,\u00a0\u0441\u0440\u0430\u0436\u0430\u044f\u0441\u044c \u0441\u00a0\u00ab\u0431\u0435\u043b\u044b\u043c\u0438 \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u043c\u0438\u00bb \u0438\u0445\u00a0\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<hr\/>\n<p>\u041f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u00a0\u0441\u0442\u043e\u043b\u044c \u043f\u043e\u044d\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0432\u043e\u0434\u043d\u0443\u044e, \u043d\u043e\u00a0\u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u00a0\u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e <strong>\u043b\u044e\u0442<\/strong>, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0432\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0441\u0438\u0445\u043e\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u044d\u0442\u043e \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u044b\u0441\u043b\u0438 \u0432\u00a0\u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u00a0\u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0448\u0438\u0437\u043e\u0444\u0440\u0435\u043d\u0438\u0438. <\/p>\n<\/blockquote>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u00a0\u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435: \u043a\u043e\u043b\u043b\u0435\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u043c \u0443\u0437\u0440\u0435\u043b <strong>\u044d\u0442\u043e<\/strong> \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0440\u043e\u0441\u0438\u043b \u043f\u0438\u0442\u044c \u0438\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u00a0\u043f\u043e\u043b\u043d\u043e\u0439\u00a0\u0437\u0430\u0432\u044f\u0437\u043a\u0435 \u0434\u043e\u00a0\u0441\u0438\u0445\u00a0\u043f\u043e\u0440. \u0421\u0435\u0434\u044c\u043c\u043e\u0439\u00a0\u0433\u043e\u0434 \u043f\u043e\u0434\u0440\u044f\u0434.<\/p>\n<p>\u041a\u00a0\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u043c\u0443 \u0431\u0435\u0437\u0443\u043c\u0438\u044e \u043d\u0430\u0434\u043e \u0443\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u0442\u0435\u043e\u0440\u0438\u044e \u0438 \u043c\u0430\u0442\u0447\u0430\u0441\u0442\u044c\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043d\u0435\u043f\u0440\u0438\u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435\u0432\u0438\u043d\u043d\u044b\u0445.<\/p>\n<h4>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0423\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 Java \u0438\u00a0C# \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0449\u044c \u043a\u0430\u043a <em>\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/em>\u00a0\u2014 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c, \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u043c.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">@Configuration @EnableCaching public class CacheConfig {        @Bean     public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(         javax.cache.CacheManager cacheManager) {         return hibernateProperties -&gt; hibernateProperties                 .put(ConfigSettings.CACHE_MANAGER, cacheManager);     }     .. }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430 @\u00a0\u2014 \u0442\u0435\u00a0\u0441\u0430\u043c\u044b\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0441\u043c\u044b\u0441\u043b\u0430, \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Spring Boot.<\/p>\n<p>\u041d\u043e \u043a\u0443\u0434\u0430 \u0447\u0430\u0449\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c:<\/p>\n<pre><code class=\"java\">\/**  * \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c '\u0437\u0430\u043a\u0430\u0437'  * @since 1.0  * @author 0x08  *\/ @Entity @Table(name = \"strm_orders\") @Indexed public class Order extends AbstractAuditingEntity implements Serializable {     @Id     @GeneratedValue(strategy = GenerationType.SEQUENCE,                      generator = \"order_seq\")     @SequenceGenerator(name = \"order_seq\")     @GenericField     private Long id;     @Column(name = \"customer_id\", nullable = false)     private long customerId;     @Column(name = \"sender_id\", nullable = false)     private long senderId;     @Enumerated(EnumType.STRING)     @Column(name = \"order_status\", nullable = false)     private OrderStatus orderStatus = OrderStatus.NEW; ..<\/code><\/pre>\n<p>\u0412\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Column<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430\u00a0\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u00a0\u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439 \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0410\u0442\u0440\u0438\u0431\u0443\u0442 <code>name<\/code> \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438.<\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0441\u0442\u044c, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0438 \u043b\u0438\u0448\u044c <em>\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c <\/em>\u043a\u00a0\u043a\u043b\u0430\u0441\u0441\u0443\u00a0\u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u00a0\u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430.  <\/p>\n<p>\u041d\u0438\u043a\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u043c \u0443\u043c\u0435 \u043d\u0435\u00a0\u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 <strong>\u0432\u0441\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u00a0\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439\u00a0\u2014 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad3\/c32\/442\/ad3c324425771c5b25b137dea3e9eb79.jpeg\" alt=\"\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c &quot;SOLID rocks&quot;\" title=\"\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c &quot;SOLID rocks&quot;\" width=\"1000\" height=\"667\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ad3\/c32\/442\/ad3c324425771c5b25b137dea3e9eb79.jpeg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad3\/c32\/442\/ad3c324425771c5b25b137dea3e9eb79.jpeg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c &#171;SOLID rocks&#187;<\/figcaption><\/div>\n<\/figure>\n<h4>SOLID<\/h4>\n<p>\u0412\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\" rel=\"noopener noreferrer nofollow\">SOLID<\/a>\u00a0\u2014 \u0430\u043a\u0440\u043e\u043d\u0438\u043c, \u043a\u0430\u0436\u0434\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e:<\/p>\n<ul>\n<li>\n<p>S:  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/a> (single responsibility principle)<\/p>\n<\/li>\n<li>\n<p>O:  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D1%81%D1%82%D0%B8\/%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D1%81%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438\/\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438<\/a> (open-closed principle)<\/p>\n<\/li>\n<li>\n<p>L: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u041b\u0438\u0441\u043a\u043e\u0432<\/a> (Liskov substitution principle)<\/p>\n<\/li>\n<li>\n<p>I: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/a> (interface segregation principle)<\/p>\n<\/li>\n<li>\n<p>D: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B8%D0%BD%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/a> (dependency inversion principle)<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u043a \u0438\u00a0\u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f, SOLID\u00a0\u2014 \u00ab\u0437\u0430\u00a0\u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0432\u0441\u0435\u0433\u043e \u043f\u043b\u043e\u0445\u043e\u0433\u043e\u00bb, \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u00a0\u0431\u0443\u043c\u0430\u0433\u0435 (\u0432\u00a0\u043a\u043d\u0438\u0433\u0430\u0445) \u0438\u00a0\u0432\u00a0\u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0440\u0435\u0437\u044e\u043c\u0435, \u043d\u043e\u00a0\u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u00a0\u043d\u0435\u00a0\u0442\u0430\u043a\u0438\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439.<\/p>\n<blockquote>\n<p>\u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c, SOLID \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043e \u043d\u0435\u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0432 \u0432 \u043f\u0441\u0438\u0445\u043e\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0436\u0438\u0440\u0430\u043d\u0438\u044f \u043c\u043e\u0437\u0433\u0430 \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0439 \u0433\u0440\u0438\u0431 \u043d\u0430\u0440\u0435\u043a\u0430\u0435\u0442 <strong>\u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u043c<\/strong> \u0438\u00a0\u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u043a\u00a0\u0432\u0435\u043b\u0438\u043a\u043e\u0439 \u043c\u0438\u0441\u0441\u0438\u0438\u00a0\u2014 \u043c\u0441\u0442\u0438\u0442\u044c \u00ab\u0431\u0435\u043b\u044b\u043c \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u043c\u00bb \u0437\u0430\u00a0\u0433\u043e\u0434\u044b \u0443\u0433\u043d\u0435\u0442\u0435\u043d\u0438\u044f \u0438\u0445\u00a0\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/058\/50e\/4c3\/05850e4c3be52d8f5c27d808465f7adc.png\" alt=\"\u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f IBM Websphere, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c\u044b\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b.\" title=\"\u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f IBM Websphere, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c\u044b\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b.\" width=\"950\" height=\"403\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/058\/50e\/4c3\/05850e4c3be52d8f5c27d808465f7adc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/058\/50e\/4c3\/05850e4c3be52d8f5c27d808465f7adc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f IBM Websphere, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c\u044b\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b.<\/figcaption><\/div>\n<\/figure>\n<h3>\u0427\u0430\u0441\u0442\u044c 0. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0434\u0436\u0438\u0445\u0430\u0434<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0441\u00a0<strong>\u043d\u0435\u0432\u0435\u0434\u043e\u043c\u044b\u043c<\/strong> \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 <s>\u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e<\/s> \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043d\u043e\u00a0\u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430 \u043d\u0430\u0448\u0443 \u0441\u043a\u0443\u0447\u043d\u0443\u044e \u0436\u0438\u0437\u043d\u044c \u0438\u00a0\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u00a0\u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0448\u043a\u043e\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0435 \u0442\u0430\u043b\u0430\u043d\u0442\u0430\u043c:<\/p>\n<blockquote>\n<p>\u043a\u00a0\u043d\u0430\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0441\u044f (\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u0432) \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u0436\u0435\u043d\u0442\u0435\u043b\u044c\u043c\u0435\u043d \u0441\u00a0\u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0441\u044c\u0431\u043e\u0439 \u00ab\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u00a0\u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u00a0\u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u00bb. <\/p>\n<\/blockquote>\n<p>\u041f\u043e\u0441\u043b\u0430\u0442\u044c \u0434\u0436\u0435\u043d\u0442\u0435\u043b\u044c\u043c\u0435\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043c\u044b\u00a0\u0441\u043e\u0447\u043b\u0438 \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u043c\u00a0\u2014 \u0432\u0441\u0435\u00a0\u0436\u0435 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0438\u0437 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u043e\u0439 \u0441\u0442\u043e\u043b\u0438\u0446\u044b, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0443\u00a0\u043d\u0435\u0433\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043f\u0440\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445, \u043a\u00a0<strong>\u0442\u0430\u043a\u043e\u043c\u0443 <\/strong>\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u00a0\u0433\u043e\u0442\u043e\u0432\u044b \u0434\u0430\u0436\u0435 \u043c\u044b\u00a0\u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043b\u044e\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0434\u0443\u043c\u0430\u044e \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044d\u0442\u043e\u0439 \u00ab\u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0443\u0436\u0430\u0441\u043e\u0432\u00bb, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u00a0\u0447\u0435\u043c \u0438\u0434\u0435\u0442 \u0440\u0435\u0447\u044c.<\/p>\n<p>\u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0432\u0432\u0438\u0434\u0443 <s>\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u00a0\u043d\u0435\u0440\u0430\u0437\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0438<\/s> \u0434\u0430\u0432\u043d\u043e \u0443\u0431\u0438\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u00a0\u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043d\u0435\u00a0<s>\u043c\u043e\u0433\u0443<\/s> \u0445\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0438\u0436\u0435\u00a0\u2014 \u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u043f\u043e\u00a0\u043c\u043e\u0442\u0438\u0432\u0430\u043c\u00bb \u0438\u00a0\u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f, \u0445\u043e\u0442\u044f \u0438 \u0437\u0430\u043d\u044f\u0432\u0448\u0430\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 <strong>\u0441\u0435\u043c\u044c \u043b\u0435\u0442<\/strong> \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438.<\/p>\n<blockquote>\n<p>\u0427\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u00a0\u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0443\u0431\u043e\u0439\u043d\u043e\u0441\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432 \u0441\u043c\u0435\u043b\u043e\u0433\u043e \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u0430 (\u0434\u0430 \u043d\u0435 \u0442\u0440\u043e\u043d\u0435\u0442 GC \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u044b), \u043f\u043e\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u00a0\u043c\u043e\u0449\u044c \u0435\u0433\u043e \u0432\u0435\u0440\u044b \u0432\u00a0\u0441\u0432\u044f\u0442\u043e\u0435 \u0434\u0435\u043b\u043e \u0431\u043e\u0440\u044c\u0431\u044b \u0441\u00a0\u00ab\u0431\u0435\u043b\u044b\u043c\u0438 \u0443\u0433\u043d\u0435\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438\u00bb \u043f\u0443\u0442\u0435\u043c \u0441\u0436\u0438\u0433\u0430\u043d\u0438\u044f \u0438\u0445 \u043c\u043e\u0437\u0433\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0441\u043e\u0431\u043e\u0439 \u0441\u0432\u044f\u0437\u043a\u0443 \u0438\u0437\u00a0<em>\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432<\/em> JEE-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043d\u0430\u00a0\u00ab\u0431\u043e\u043b\u044c\u0448\u043e\u0439\u00bb\u00a0IBM Websphere \u0438\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e Java 8, \u043d\u043e \u0440\u0430\u0434\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f\u00a0\u043c\u044b\u00a0\u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 Jakarta 10, \u0441\u043e\u00a0\u0432\u0441\u0435\u043c\u0438 \u043d\u0430\u0432\u043e\u0440\u043e\u0442\u0430\u043c\u0438 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Java (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0441\u00a0\u0447\u0435\u0433\u043e\u2011\u0442\u043e \u0431\u043e\u043b\u0435\u0435\u2011\u043c\u0435\u043d\u0435\u0435 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e\u0433\u043e, \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u00a0\u0440\u0430\u043c\u043a\u0438 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438: <\/p>\n<pre><code class=\"java\">.. @WebFilter(\"\/*\") @WebListener public class Foo implements Filter,ServletContextListener{      \/\/ \u0432\u0430\u0436\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f   private int someImportantValue = 42;    @Override   public void contextInitialized(ServletContextEvent sce) {            final ServletContext sc = sce.getServletContext();         \/\/ \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441         sc.setAttribute(\"foo\", this);  }  ..     @Override   public void doFilter(ServletRequest sr,                        ServletResponse sr1, FilterChain fc)                              throws IOException, ServletException {                 final ServletContext sc = sr.getServletContext();         \/\/ \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0436\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430         Foo foo = (Foo)sc.getAttribute(\"foo\");                  if (foo.someImportantValue == 42) {            \/\/ \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430                  ..            }     }   .. }<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0445\u0440\u0430\u0431\u0440\u044b\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u00a0<s>\u043c\u043e\u043b\u0438\u0442\u0432 \u041a\u0440\u0438\u0448\u043d\u0435<\/s> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043e\u0434\u043d\u0443 \u0438\u00a0\u0442\u0443\u00a0\u0436\u0435 \u043a\u043e\u043f\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u00a0Servlet API (Filter \u0438\u00a0Listener), \u0441\u00a0\u0440\u0430\u0437\u043d\u044b\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c.<\/p>\n<blockquote>\n<p>\u0421\u0432\u044f\u0437\u0430\u0432 \u0438\u0445\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0441\u00a0\u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c\u044e\u00a0\u2014 \u0440\u0430\u0434\u0438 \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u043e\u0435\u0432 \u043c\u043e\u0437\u0433\u0443 \u043d\u0435\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u00ab\u0431\u0435\u043b\u043e\u0433\u043e \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u00bb.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435\u00a0\u044d\u0442\u043e \u0435\u0449\u0435 \u0446\u0432\u0435\u0442\u043e\u0447\u043a\u0438, \u043f\u043e\u00a0\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u043e\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0435\u0434\u0435\u0432\u0440\u043e\u043c \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u043c\u044b\u0441\u043b\u0438, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0439 \u0431\u0435\u0434\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0440\u043e\u0441\u0438\u043b \u043f\u0438\u0442\u044c:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"t_foo\") @NamedQueries({     @NamedQuery(name = \"Foo.fetchAll\",             query = \"SELECT f FROM Foo f order by f.id desc\") }) @Named @RequestScoped public class Foo {      @Id     @SequenceGenerator     @GeneratedValue(strategy = GenerationType.SEQUENCE,                      generator = \"default_gen\")     private Long id;          @Size(min = 3, max = 255)     @Pattern(regexp = \"[a-zA-Z0-9._ -?!]+\")     private String title;          ..      private transient Foo instance;          @Transient     @PersistenceContext     private EntityManager em;          ..          public List&lt;Foo&gt; fetchRecords() {         return this.em.createNamedQuery(\"Foo.fetchAll\",Foo.class).getResultList();     } .. }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0434\u043b\u044f J2EE\/JEE\/Jakarta \u0438\u00a0\u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 JPA, JTA, JSF \u0432\u00a0\u0440\u0430\u0431\u043e\u0442\u0435\u00a0\u2014 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430 \u0432\u0430\u043b\u0438\u0434\u043e\u043b\u043e\u043c.<\/p>\n<blockquote>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438\u00a0\u0443\u0436\u0430\u0441\u044b \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u043e\u0448\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0443\u0442\u044c \u0438 \u0441\u043c\u044b\u0441\u043b.<\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u043a\u043b\u0430\u0441\u0441 <code>Foo<\/code> \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043d\u0430\u0432\u0435\u0448\u0430\u043d\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445  \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c: <\/p>\n<ul>\n<li>\n<p>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (Entity) JPA, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0438\u043d\u0430 CDI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b JSF.<\/p>\n<\/li>\n<\/ul>\n<p>C\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\"> &lt;p&gt;     &lt;ui:repeat value=\"#{foo.fetchRecords()}\" var=\"record\"&gt;                        &lt;div style=\"padding-left: 2em; font-style: italic;\"&gt;                             &lt;h:outputText value=\"#{record.title}\"\/&gt;               &lt;\/div&gt;               ..     &lt;\/ui:repeat&gt; &lt;\/p&gt;<\/code><\/pre>\n<p>\u041d\u043e\u00a0\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0443\u0442 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0435\u0441\u0435\u043b\u0435\u0435\u00a0\u2014 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u00a0\u043f\u043e\u043b\u0435 <code>instance<\/code>:<\/p>\n<pre><code>private transient Foo instance;<\/code><\/pre>\n<p>\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0433\u0443\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435.. DTO!<\/p>\n<p>\u0421\u0447\u0438\u0442\u0430\u044e \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0\u2014 \u0432\u0435\u0440\u0445 \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 SOLID, \u0434\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0434\u043e \u0431\u0435\u0437\u0443\u043c\u0438\u044f, \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0441\u0442\u0438 \u0431\u0435\u043b\u044b\u043c \u0443\u0433\u043d\u0435\u0442\u0430\u0442\u0435\u043b\u044f\u043c <s>\u043f\u043e\u00a0\u0437\u0430\u043a\u0430\u0437\u0443 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0445 \u0433\u0440\u0438\u0431\u043e\u0432<\/s>.<\/p>\n<p>\u0422\u0430\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u00a0\u043e\u0434\u0438\u043d \u0438\u00a0\u043d\u0435\u00a0\u0434\u0432\u0430, \u0430\u00a0\u043e\u043a\u043e\u043b\u043e 700\u00a0\u2014 <strong>\u0446\u0435\u043b\u0430\u044f \u0430\u0440\u043c\u0438\u044f<\/strong> \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u0431\u0438\u043d\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u00a0\u0441\u0435\u0431\u044f \u043e\u0442\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u00a0\u0434\u043e\u00a0\u043a\u043e\u043d\u0446\u0430. <\/p>\n<blockquote>\n<p>\u0412\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0431\u0438\u043d\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0434\u0440\u0443\u0433-\u0434\u0440\u0443\u0433\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u00a0\u0441\u0435\u0442\u0438, \u0438\u043d\u043e\u0433\u0434\u0430\u00a0\u2014 \u0447\u0435\u0440\u0435\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u044b\u043b\u043e \u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Java-\u0431\u0438\u043d\u043e\u0432 \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430 \u0442\u043e \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439, \u043d\u043e JEE-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0432\u0441\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0436\u0435\u0441\u0442\u044c,\u00a0\u0433\u043e\u0440\u0434\u044b\u0439 \u0441\u044b\u043d \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0440\u043e\u0434\u0430\u00a0\u2014 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442 (\u0434\u0430\u00a0\u0431\u0443\u0434\u0443\u0442 \u0432\u0435\u0447\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0438) \u043d\u0435\u00a0\u0443\u0441\u043f\u043e\u043a\u043e\u0438\u043b\u0441\u044f, \u0440\u0435\u0448\u0438\u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c \u0431\u0435\u043b\u044b\u0445 \u0432\u0430\u0440\u0432\u0430\u0440\u043e\u0432, \u0436\u0438\u0432\u0443\u0449\u0438\u0445 \u0437\u0430\u00a0\u043e\u043a\u0435\u0430\u043d\u043e\u043c \u0438\u00a0\u0441\u0436\u0435\u0447\u044c \u0438\u043c\u00a0\u043f\u0441\u0438\u0445\u0438\u043a\u0443 \u0442\u0430\u043a\u0438\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c API:<\/p>\n<pre><code class=\"java\">.. @WebMethod @POST @Path(\"addMessage\") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.TEXT_PLAIN) @Transactional(Transactional.TxType.REQUIRED) public String addMessage(             @FormParam(\"title\") String title,             @FormParam(\"author\") String author,             @FormParam(\"message\") String message) {             ..             }              ..<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u00a0\u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0435 SOAP \u043e\u0442\u00a0REST \u0438\u00a0\u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <a href=\"https:\/\/github.com\/jakartaee\/jax-ws-api\" rel=\"noopener noreferrer nofollow\">JAX-WS<\/a> \u0438\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Jakarta_RESTful_Web_Services\" rel=\"noopener noreferrer nofollow\">JAX-RS<\/a>\u00a0\u2014 \u0441\u00a0\u043a\u043e\u0434\u0430 \u0432\u044b\u0448\u0435 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u043b\u043e\u0445\u0435\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0438\u0435 \u0435\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0435 \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u043a\u043e\u0440\u0431\u043b\u0435\u043d\u0438\u0435 \u0447\u0443\u0432\u0441\u0442\u0432 \u0432\u0435\u0440\u0443\u044e\u0449\u0438\u0445 \u0432\u00a0\u0432\u044b\u0441\u043e\u043a\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0435\u043f\u0440\u0438\u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e:<\/p>\n<blockquote>\n<p>API \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e, \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u00a0\u2014 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f API, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431, \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0432\u0435\u0431\u0430: HTTP\/HTTPS. <\/p>\n<\/blockquote>\n<p>REST \u0438 SOAP\u00a0\u2014 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043e\u0434\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 JSON, \u0434\u0440\u0443\u0433\u043e\u0439\u00a0\u2014 XML (\u0435\u0441\u043b\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e) \u0434\u043b\u044f\u00a0\u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. JAX\u2011WS \u0438 JAX\u2011RS\u00a0\u2014 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u0435 SOAP \u0438 \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434 RESTful \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u0430. <\/p>\n<blockquote>\n<p>\u041e\u0441\u043e\u0431\u0443\u044e \u043f\u0438\u043a\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u00a0\u043d\u043e\u0432\u044b\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438\u0434\u0430\u0435\u0442 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u00a0\u2014 <strong>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441<\/strong> \u043a\u043b\u0430\u0441\u0441\u0430, \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c.<\/p>\n<\/blockquote>\n<p>\u0410 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043e\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 CDI. <\/p>\n<p>\u0418\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 ServletContext. <\/p>\n<p>\u0418\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d. <\/p>\n<p>\u0418\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 EJB. <\/p>\n<p>\u0418\u043b\u0438 \u043f\u043e \u0441\u0435\u0442\u0438.<\/p>\n<p>\u0418\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (JMS).<\/p>\n<p>\u0413\u043e\u0440\u0434\u044b\u0439 \u0441\u044b\u043d \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0440\u043e\u0434\u0430 \u043b\u044e\u0431\u0438\u043b \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435.<\/p>\n<p>\u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f:<\/p>\n<blockquote>\n<p>\u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b <strong>\u0445\u043e\u0442\u044f-\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c<\/strong> \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u0435\u0441\u044c \u043d\u0430\u0448 \u043c\u043d\u043e\u0433\u043e\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0433\u043e\u0432\u0435\u043d\u00a0\u2014 \u043d\u0438\u00a0\u0432\u00a0\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u0430\u0445, wiki, stackoverflow, \u0444\u043e\u0440\u0443\u043c\u0430\u0445 \u0438\u00a0\u0434\u043e\u0441\u043a\u0430\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043d\u0435\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c. <\/p>\n<\/blockquote>\n<p>\u0422\u0430\u043a\u043e\u0432\u0430 \u0441\u0438\u043b\u0430 \u0438 \u043c\u043e\u0449\u044c \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u0448\u043a\u043e\u043b\u044b.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/50a\/f15\/d42\/50af15d4241eff97d0d231f807cc99f7.jpeg\" alt=\"\" title=\"\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/50a\/f15\/d42\/50af15d4241eff97d0d231f807cc99f7.jpeg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/50a\/f15\/d42\/50af15d4241eff97d0d231f807cc99f7.jpeg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0427\u0430\u0441\u0442\u044c 1. \u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043e\u0432\u044b\u0439 \u044d\u043d\u0442\u0435\u0440\u043f\u0440\u0430\u0438\u0437<\/h3>\n<p>\u041c\u044b\u00a0\u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0432\u0438\u0433 \u0445\u0440\u0430\u0431\u0440\u043e\u0433\u043e \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u0430 (\u0434\u0430\u00a0\u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0443\u043f\u0430\u0434\u0443\u0442 \u0435\u0433\u043e \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b) \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u0435\u043b\u0438\u043a\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0438\u0434\u0435\u0438 \u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0438\u00a0\u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u0442\u043e\u0433\u043e\u00a0\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043c\u0441\u0442\u0438\u0442\u044c \u00ab\u0431\u0435\u043b\u044b\u043c \u0443\u0433\u043d\u0435\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u00bb, \u0441\u0436\u0438\u0433\u0430\u044f \u0432\u0440\u0430\u0436\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u0437\u0433\u0438 \u0438\u0445\u00a0\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<blockquote>\n<p>\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u043b\u0438 \u0441\u0430\u043c\u0443\u044e \u043b\u044e\u0442\u0443\u044e \u0434\u0438\u0447\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u0431\u0438\u0442\u043e\u0433\u043e \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0441\u0432\u0435\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u043a\u043d\u0438\u0433\u0443.<\/p>\n<\/blockquote>\n<p>\u0424\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0432\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e <strong>\u043e\u0434\u0438\u043d<\/strong> \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 Java, \u0431\u0435\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0418 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u043b\u044c \u0443\u043f\u043e\u0440\u043e\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 API Jakarta 10:<\/p>\n<ul>\n<li>\n<p>WildFly <\/p>\n<\/li>\n<li>\n<p>Open Liberty \/ IBM WebSphere Liberty<\/p>\n<\/li>\n<li>\n<p>Eclipse GlassFish <\/p>\n<\/li>\n<li>\n<p>Payara<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u043e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u043a\u0440\u0430\u043d):<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b7\/36c\/314\/9b736c3146a806b135ce9a27d98db5b3.png\" width=\"1239\" height=\"860\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9b7\/36c\/314\/9b736c3146a806b135ce9a27d98db5b3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b7\/36c\/314\/9b736c3146a806b135ce9a27d98db5b3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u043b\u044f \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0431\u044b\u043b \u0432\u0437\u044f\u0442 <a href=\"https:\/\/jenil.github.io\/chota\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 CSS-\u043c\u0438\u043a\u0440\u043e\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/a> \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0434\u043b\u044f \u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0445\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c. <\/p>\n<p>\u0423\u0447\u0438\u043c \u0445\u0438\u043d\u0434\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0430\u0432\u0442\u043e\u0440\u043e\u043c:<\/p>\n<blockquote>\n<p><em>FWIW, &#171;cho\u1e6d\u0101&#187; means &#171;small&#187; in Hindi<\/em><\/p>\n<\/blockquote>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u043a\u043d\u0438\u0433\u0438\u00a0\u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u00a0\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/672\/999\/8b2\/6729998b21b70750887b102222848d07.gif\" width=\"800\" height=\"755\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/672\/999\/8b2\/6729998b21b70750887b102222848d07.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/672\/999\/8b2\/6729998b21b70750887b102222848d07.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2ca\/cbd\/b01\/2cacbdb0117e03ba1999fcad6e900163.gif\" width=\"800\" height=\"706\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2ca\/cbd\/b01\/2cacbdb0117e03ba1999fcad6e900163.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2ca\/cbd\/b01\/2cacbdb0117e03ba1999fcad6e900163.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 API, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u044d\u0442\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 <strong>\u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441<\/strong> \u043d\u0430 Java.<\/p>\n<h4>JAX-WS<\/h4>\n<p>\u0412\u044b\u0437\u043e\u0432 JAX-WS (SOAP) \u0438\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 Python:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/685\/434\/a31\/685434a31e3885907e6abad3a2dcb205.gif\" width=\"800\" height=\"477\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/685\/434\/a31\/685434a31e3885907e6abad3a2dcb205.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/685\/434\/a31\/685434a31e3885907e6abad3a2dcb205.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0430 Python:<\/p>\n<pre><code class=\"python\">from zeep import Client  # \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 wsdl \u0444\u0430\u0439\u043b client = Client('http:\/\/localhost:9080\/madjavaee-1.0.1-RELEASE\/MegaBeanService?wsdl') # \u0432\u044b\u0437\u043e\u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 result = client.service.doPing() print(result)  # \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 DTO  factory = client.type_factory('http:\/\/madjavaee.experiments.Ox08.com\/') message = factory.megaBean(title='new title', author='test@test.com', message='test message') # \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 API \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438  result = client.service.addMessage(message) print(result)  # \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 API result = client.service.fetchRecords() print(result) # \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 API result = client.service.fetchRecordsCount() print(result)<\/code><\/pre>\n<h4>JAX-RS<\/h4>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u0430 JAX-RS (REST) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e curl \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/553\/1d0\/a91\/5531d0a91d11f5331d6e4ad4b94ff3fa.gif\" width=\"800\" height=\"509\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/553\/1d0\/a91\/5531d0a91d11f5331d6e4ad4b94ff3fa.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/553\/1d0\/a91\/5531d0a91d11f5331d6e4ad4b94ff3fa.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e curl:<\/p>\n<pre><code class=\"bash\">curl -H \"Content-Type: application\/json\" -X POST http:\/\/localhost:9080\/madjavaee-1.0.1-RELEASE\/api\/addMessage -d '{\"title\":\"test title2\",\"author\":\"user@test.com\", \"message\":\"some message\"}'<\/code><\/pre>\n<h3>\u0427\u0430\u0441\u0442\u044c 2. \u041f\u0441\u0438\u0445\u043e\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435<\/h3>\n<p>\u0422\u043e\u00a0\u0447\u0442\u043e \u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u0443\u00a0\u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 <em>\u043f\u0441\u0438\u0445\u043e\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0438\u0433\u0430\u0442\u044c \u043c\u043e\u0437\u0433 \u043d\u0435\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u00a0\u0442\u0430\u043a\u043e\u043c\u0443 \u043d\u0430\u043a\u0430\u043b\u0443 \u0434\u0438\u0447\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0432\u0438\u0434\u0435\u043b\u0438 \u043a\u043e\u0434, \u0437\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0441\u00a0\u0432\u044b\u0441\u0448\u0438\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0431\u0438\u0442\u044c \u043d\u043e\u0433\u0430\u043c\u0438 \u043f\u0440\u044f\u043c\u043e \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043c\u0435\u0441\u0442\u0435\u00a0\u2014 \u043d\u0438\u0436\u0435 \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f.<\/p>\n<p>\u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d7e\/faa\/bd3\/d7efaabd36a2f940c26f45a1e16460fe.png\" width=\"1159\" height=\"76\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d7e\/faa\/bd3\/d7efaabd36a2f940c26f45a1e16460fe.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d7e\/faa\/bd3\/d7efaabd36a2f940c26f45a1e16460fe.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>~600 \u0441\u0442\u0440\u043e\u043a \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 ~200\u00a0\u2014 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0438\u0442\u043e\u0433\u043e ~<strong>400<\/strong> \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u00a0\u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0438 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0448\u0435\u0434\u0435\u0432\u0440\u043e\u043c:<\/p>\n<pre><code class=\"java\">package com.Ox08.experiments.madjavaee; \/\/ Common Java import java.io.*; import java.util.*; import java.util.logging.*; \/\/ CDI import jakarta.enterprise.context.*; import jakarta.inject.*; \/\/ JPA import jakarta.persistence.*; import jakarta.persistence.criteria.*; \/\/ JSR 303 Validation API import jakarta.validation.constraints.*; \/\/ JSF import jakarta.faces.application.FacesMessage; import jakarta.faces.context.*; \/\/ JSR 375 import jakarta.security.enterprise.AuthenticationStatus; import jakarta.security.enterprise.authentication.mechanism.http.*; import jakarta.security.enterprise.credential.*; import jakarta.security.enterprise.identitystore.*; \/\/ Servlet API import jakarta.servlet.*; import jakarta.servlet.annotation.*; import jakarta.servlet.http.*; \/\/ JTA import jakarta.transaction.Transactional; \/\/ JAX-RS import jakarta.ws.rs.core.*; import jakarta.ws.rs.ext.*; import jakarta.ws.rs.*; \/\/ JAX-WS import jakarta.jws.*; \/**  * This is single class CRUD application, based on recent Java EE stack.  *  * @author &lt;a href=\"mailto:alex3.145@gmail.com\"&gt;Alex Chernyshev&lt;\/a&gt;  *\/ \/\/ ordinary JPA entity annotations @Entity @Table(name = \"t_records\") @NamedQueries({     @NamedQuery(name = \"MegaBean.getAllRecords\",             query = \"SELECT m FROM MegaBean m order by m.id desc\") }) \/\/ CDI bean annotation, which used to register instance of this class as CDI managed bean \/\/ This is required for EntityManager injection @Named \/\/ Java Faces annotation, required to trigger JSF initialization on some servers @jakarta.faces.annotation.FacesConfig()         \/\/(version = FacesConfig.Version.JSF_2_3) - deprecated in Faces 4.0 and upper \/\/ JSF annotation, required to bypass jsr299 validation see WebContainer.validateJSR299Scope @Dependent \/\/@ApplicationScoped or @RequestScoped are not allowed, because of @WebFilter\/@WebListener annotations presence \/\/ Servlet 3.0 annotations \/\/ Servlet Filter - another instance of this class will be registered as servlet filter @WebFilter(\"\/*\") \/\/ One more instance will be registered as servlet context listener, to be used as initialization point. \/\/ All because we can't use @ApplicationScoped and @Observes here @WebListener \/\/ See JSR375 spec for details @CustomFormAuthenticationMechanismDefinition(         loginToContinue = @LoginToContinue(                 loginPage = \"\/index.xhtml?login=true\",                 useForwardToLogin = false,                 errorPage = \"\/index.xhtml?login=true&amp;error=true\"         ) ) \/\/ used only when embedded IdentityStore in use @jakarta.annotation.security.DeclareRoles({\"admin\", \"user\", \"demo\"}) \/\/ JAX-RS annotations @ApplicationPath(\"api\") @jakarta.ws.rs.Path(\"\") \/\/ this is required for ExceptionMapper @jakarta.ws.rs.ext.Provider \/\/ JAX-WS binding (SOAP) Warning: conflicts with JAX-RS on OpenLiberty and Wildfly! \/\/@WebService public class MegaBean extends Application implements Serializable,         jakarta.servlet.Filter,         ServletContextListener,         \/\/ Because OpenLiberty\/IBM Websphere Liberty does not support  combination of         \/\/ CustomFormAuthenticationMechanismDefinition and HttpAuthenticationMechanism,         \/\/ I was required to remove HttpAuthenticationMechanism interface         \/\/ Custom IdentityStore does not work without @ApplicationScoped on OpenLiberty         IdentityStore, \/\/ see JSR375         ExceptionMapper&lt;Exception&gt; {     public MegaBean() {         \/\/ call for JAX-RS parent class         super();         \/*          * we need to set some default values to bypass JSR 303 bean validation for          * JAX-RS bean, otherwise, JAX-RS service will not work.          *\/         this.author = \"no@no.org\";         this.createdAt = new Date();         this.message = \"no no no\";         this.title = \"test title\";     }     \/**      * We need to have an instance of this class as DTO - to transfer data from      * html form      *\/     private transient MegaBean current;     \/**      * This class is also a CDI managed bean, remember? So here we will inject      * EntityManager      *\/     @Transient     @PersistenceContext(unitName = \"megaPU\")     private EntityManager em;     \/**      * Security context maybe null when JAAS API was not initialized, so it's wrapped with @Instance      *\/     @Transient     @Inject     private jakarta.enterprise.inject.Instance&lt;jakarta.security.enterprise.SecurityContext&gt; securityContext;     @Transient     @Context     private ServletContext servletContext;     \/**      * Ordinary JPA fields      *\/     @Id     @SequenceGenerator(name = \"default_gen\", sequenceName = \"w_default_pk_seq\")     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = \"default_gen\")     private Long id; \/\/ unique id, this sequence will be created automatically too     @Size(min = 3, max = 255)     @Pattern(regexp = \"[a-zA-Z0-9._ -?!]+\")     private String title; \/\/ used also as 'login' field for auth     @Size(min = 3, max = 30)     @Email     private String author; \/\/ used also as 'password' field for auth     @Lob     @Column(length = Integer.MAX_VALUE)     @NotBlank(message = \"message may not be blank\")     private String message; \/\/message body, CLOB\/TEXT\/BLOB type will be used in database     @Column(name = \"created_date\", nullable = false)     @Temporal(TemporalType.TIMESTAMP)     @NotNull     protected Date createdAt;     \/**      * this called from JSF page to clean up fields on page reload      *\/     @WebMethod(exclude = true)     public void init() { resetFields(this); }     \/**      * Each and every interface methods should be implemented and marked with      * Annotation WebMethod(exclude = true) used to avoid bug in Apache CXF (Wildfly\/OpenLiberty)      * &lt;a href=\"https:\/\/issues.apache.org\/jira\/browse\/CXF-4916\"&gt;...&lt;\/a&gt;      * Method 'contextDestroyed' is part of ServletContextListener interface, so must be implemented      *\/     @WebMethod(exclude = true)     @Override     public void contextDestroyed(ServletContextEvent sce) {         \/\/ not used     }     \/**      * Part of ServletContextListener API, used on app start\/reload      *\/     @Override     @WebMethod(exclude = true)     \/\/ transactional is required to let EntityManager do his job     @Transactional(Transactional.TxType.REQUIRED)     public void contextInitialized(ServletContextEvent sce) {         final ServletContext sc = sce.getServletContext();         \/\/ due to CDI vs servlet conflict         sc.setAttribute(\"mega\", this);         \/\/ we can make it only here due to stackoverflow error in eclipselink         this.current = new MegaBean();         \/\/ reset fields back to nulls - to have working JSR303 validation         resetFields(this.current);         \/\/ populate JSF version details         addVersionEnv(sc);         \/\/ try to add some initial data if database is empty         try {             if (fetchRecordsCount() == 0) {                 \/\/create test entity                 final MegaBean r = new MegaBean();                 r.setCreatedAt(new Date());                 r.setAuthor(\"system@test.org\");                 r.setMessage(\"Test message\");                 r.setTitle(\"Test title\");                 em.merge(r);                 LOG.info(String.format(\"automatically added default record: %d\", r.getId()));             }         } catch (Exception e) {             LOG.log(Level.WARNING,                     String.format(\"Exception on startup: %s\", e.getMessage()), e);         }     }     \/**      * JSF bean method, used to save form (from itself)      *\/     @WebMethod(exclude = true)     @Transactional(value=Transactional.TxType.REQUIRED,rollbackOn = Exception.class)     public String save() {         \/\/ set creation date&amp;time         current.setCreatedAt(new Date());         em.merge(current);         \/\/ this is required to reset form fields         this.current = new MegaBean();         resetFields(this.current);         \/\/ does redirect         return \"\/index.xhtml?faces-redirect=true\";     }     \/**      * Does login action from JSF page      * @throws IOException      *          if God was not on our side      *\/     @WebMethod(exclude = true)     public void login() throws IOException {         \/\/ we need to re-use 2 existing fields, present in this class: 'author for username and 'title' for password         final Credential credential = new UsernamePasswordCredential(author, new Password(title));         final FacesContext facesContext =FacesContext.getCurrentInstance();         final ExternalContext ec =  facesContext.getExternalContext();         \/\/ should not happen, this is used to avoid class cast         if (!(ec.getRequest() instanceof HttpServletRequest req)                 || !(ec.getResponse() instanceof HttpServletResponse res)) {             ec.getRequestMap().put(\"login\", \"true\");             facesContext.addMessage(null,                     new FacesMessage(FacesMessage.SEVERITY_ERROR, \"Login failed\", null));             return;         }         \/\/ check if JAAS initialized         if (!securityContext.isResolvable()) {             LOG.warning(\"SecurityContext cannot be resolved!\");             return;         }         \/\/ try to authenticate programmatically         final AuthenticationStatus status = securityContext.get()                 .authenticate(                         req, res,                         AuthenticationParameters.withParams().credential(credential));         if (status == null) {             LOG.warning(\"JAAS not initialized!\");             return;         }         LOG.fine(String.format(\"auth status: %s\",status));         switch (status) {             case SEND_CONTINUE: {                 facesContext.responseComplete();                 break;             }             case SEND_FAILURE: {                 ec.getRequestMap().put(\"login\", \"true\");                 facesContext.addMessage(null,                         new FacesMessage(FacesMessage.SEVERITY_ERROR, \"Login failed\", null));                 break;             }             case SUCCESS: {                 putCurrentUser(current);                 LOG.info(String.format(\"logged in as %s\",current.author));                 facesContext.addMessage(null,                         new FacesMessage(FacesMessage.SEVERITY_INFO, \"Login succeed\", null));                 \/\/ after redirect there will be full page reload                 ec.redirect(ec.getRequestContextPath() + \"\/index.xhtml?ok=true\");                 break;             }             case NOT_DONE:                 facesContext.responseComplete();                 break;         }     }     \/**      * Does logout action from JSF page      *      * @return      * @throws ServletException      *\/     @WebMethod(exclude = true)     public String logout() throws ServletException {         final FacesContext facesContext =FacesContext.getCurrentInstance();         final ExternalContext ec = facesContext.getExternalContext();         \/\/ check for impossible state         if (!(ec.getRequest() instanceof HttpServletRequest req)) {             facesContext.addMessage(null,                     new FacesMessage(FacesMessage.SEVERITY_ERROR, \"Logout failed\", null));             return \"\";         }         req.logout();         ec.invalidateSession();         return \"\/index.xhtml?faces-redirect=true\";     }     \/**      * JPA Entity fields      * -------------------------------------------------------------------------------------------      *\/     @WebMethod(exclude = true)     public String getAuthor() { return author; }     @WebMethod(exclude = true)     public void setAuthor(String author) { this.author = author; }     @WebMethod(exclude = true)     @jakarta.json.bind.annotation.JsonbTransient     public MegaBean getCurrent() {         return current;     }     @WebMethod(exclude = true)     public Date getCreatedAt() {         return createdAt;     }     @WebMethod(exclude = true)     public void setCreatedAt(Date createdAt) {         this.createdAt = createdAt;     }     @WebMethod(exclude = true)     public Long getId() {         return id;     }     @WebMethod(exclude = true)     public void setId(Long id) {         this.id = id;     }     @WebMethod(exclude = true)     public String getTitle() {         return title;     }     @WebMethod(exclude = true)     public void setTitle(String title) { this.title = title; }     @WebMethod(exclude = true)     public String getMessage() { return message; }     @WebMethod(exclude = true)     public void setMessage(String message) { this.message = message; }     \/**      * JAX-RS &amp; JAX-WS Methods      * -----------------------------------------------------------      * Each method serves for both APIs      * Ping is a test method, which respond plain text      *\/     @GET     @jakarta.ws.rs.Path(\"ping\")     @Produces(MediaType.TEXT_PLAIN)     @WebMethod     public String doPing() { return \"pong: \" + System.currentTimeMillis(); }     \/**      * Adds new message to guestbook from API      * @param dto      *          new message data      * @return      *\/     @WebMethod     @POST     @jakarta.ws.rs.Path(\"addMessage\")     @Consumes(MediaType.APPLICATION_JSON)     @Produces(MediaType.TEXT_PLAIN)     \/\/ for JAX-WS only     @Transactional     public String addMessage(MegaBean dto) {         LOG.info(String.format(\"prepare to add record %s , %s , %s\", author, title, message));         final MegaBean r = new MegaBean();         r.setCreatedAt(new Date());         r.setAuthor(dto.author);         r.setMessage(dto.message);         r.setTitle(dto.title);         \/\/ for JAX-RS, EntityManager should be injected         if (em!=null &amp;&amp; em.isJoinedToTransaction())             return addMessageImpl(r);         \/\/ otherwise, take EntityManager from servlet context         \/\/ note: access to servletContext from JAX-RS will trigger exception:         \/\/ RESTEASY003880: Unable to find contextual data of type: jakarta.servlet.ServletContext         else {             final MegaBean mb = (MegaBean) servletContext.getAttribute(\"mega\");             return mb.addMessageImpl(r);         }     }      \/**      * This 'black magic' is required, because JAX-WS does not allow transaction injection on service method      *\/     @Transactional(Transactional.TxType.REQUIRED)     @WebMethod(exclude = true)     public String addMessageImpl(MegaBean r) {         try {             r=em.merge(r);             LOG.info(String.format(\"saved record %d\", r.id));             return String.format(\"Message added: %d %n\", r.id);         } catch (Exception e) {             LOG.log(Level.WARNING, e.getMessage(), e);             return String.format(\"Error on saving: %s\", e.getMessage());         }     }      \/**      * Uses Criteria API to retrieve count of records      *\/     @WebMethod     @GET     @jakarta.ws.rs.Path(\"recordsCount\")     @Produces(MediaType.TEXT_PLAIN)     public Long fetchRecordsCount() {         final EntityManager em = selectEm();         final CriteriaBuilder qb = em.getCriteriaBuilder();         final CriteriaQuery&lt;Long&gt; cq = qb.createQuery(Long.class);         cq.select(qb.count(cq.from(MegaBean.class)));         return em.createQuery(cq).getSingleResult();     }      \/**      * API method to retrieve all guestbook records      *\/     @WebMethod     @GET     @jakarta.ws.rs.Path(\"records\")     @Produces(MediaType.APPLICATION_JSON + \"; charset=UTF-8\")     public List&lt;MegaBean&gt; fetchRecords() {         return selectEm().createNamedQuery(\"MegaBean.getAllRecords\", MegaBean.class).getResultList();     }      \/**      * API method to get currently authenticated user details      *\/     @GET     @Produces(MediaType.APPLICATION_JSON + \"; charset=UTF-8\")     @jakarta.ws.rs.Path(\"details\")     @WebMethod(exclude = true)     public Response userDetails(@Context SecurityContext sc) {         final java.security.Principal p = sc.getUserPrincipal(); \/\/ see sc.getCallerPrincipal() in Jakarta EE;         return p != null ? Response.ok(p.getName()).build() :                 Response.status(Response.Status.UNAUTHORIZED).build();     }     \/**      * Methods below are required , due to re-use of same class for both JAX-WS      * and JAX-RS      * -------------------------------------------------------------------------------------------------------      *      *\/     \/\/ part of IdentityStore API, not used     @Override     @WebMethod(exclude = true)     public Set&lt;String&gt; getCallerGroups(CredentialValidationResult validationResult) {         return Collections.emptySet();     }     @Override     @WebMethod(exclude = true)     public int priority() {         return 100;     }     @Override     @WebMethod(exclude = true)     public Set&lt;ValidationType&gt; validationTypes() {         return DEFAULT_VALIDATION_TYPES;     }     @WebMethod(exclude = true)     @Override     public void init(FilterConfig filterConfig) { }     @WebMethod(exclude = true)     @Override     public void destroy() { }     \/**      * this filter is used to redirect from \/ to actual jsf page      *      *\/     @Override     @WebMethod(exclude = true)     public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc)             throws IOException, ServletException {         final HttpServletRequest request = (HttpServletRequest) sr;         LOG.info(String.format(\"got request: %s\", request.getRequestURI()));         \/\/ required for correct characters encoding         request.setCharacterEncoding(\"UTF-8\");         final String p = request.getRequestURI(),                 cp = request.getServletContext().getContextPath();         String url = p;         if (p.startsWith(cp)) url = p.substring(cp.length());         if (\"\/\".equals(url) &amp;&amp; sr1 instanceof HttpServletResponse hsr)             hsr.sendRedirect(cp + \"\/index.xhtml\");         else fc.doFilter(sr, sr1);     }     \/**      * Custom JSR375 validation      * Used in combination with IdentityStore      * @param credential      * @return       *\/     @Override     @WebMethod(exclude = true)     public CredentialValidationResult validate(Credential credential) {         \/\/ should not happen         if (!(credential instanceof UsernamePasswordCredential userCredential))             return CredentialValidationResult.INVALID_RESULT;         final String login = userCredential.getCaller();         LOG.info(String.format(\"called validate for %s\", login));         if (!USERS.containsKey(login))             return CredentialValidationResult.INVALID_RESULT;         final Map&lt;String, Object&gt; user = USERS.get(login);         \/\/ dumb password check         if (!userCredential.compareTo(login, (String) user.get(\"password\")))             return CredentialValidationResult.INVALID_RESULT;         LOG.info(String.format(\"user %s validated\", login));         return new CredentialValidationResult(login,                 new HashSet&lt;&gt;(Arrays.asList((String[]) user.get(\"roles\"))));     }      \/**      * JAX-RS exception handler      * @param e      * @return      *\/     @Override     @WebMethod(exclude = true)     public Response toResponse(Exception e) {         LOG.log(Level.WARNING, String.format(\"Exception on call : %s\", e.getMessage()), e);         return Response.status(400).entity(e.getMessage())                 .type(\"text\/plain\").build();     }     \/\/ !! required for YASSON parser, otherwise exception will raise:     \/\/  Error accessing getter 'getEnclosingConstructor' declared in 'class java.lang.Class'     @Override     @WebMethod(exclude = true)     @jakarta.json.bind.annotation.JsonbTransient     public Set&lt;Class&lt;?&gt;&gt; getClasses() { return Collections.emptySet();}      \/*         remove from JAX-RS\/JAX-WS output     *\/     @Override     @WebMethod(exclude = true)     @jakarta.json.bind.annotation.JsonbTransient     public Set&lt;Object&gt; getSingletons() { return Collections.emptySet();}     \/*         remove from JAX-RS\/JAX-WS output     *\/     @Override     @WebMethod(exclude = true)     @jakarta.json.bind.annotation.JsonbTransient     public Map&lt;String,Object&gt; getProperties() { return Collections.emptyMap();}     \/**      * Clean fields for provided instance      * @param m      *          bean instance      *\/     private void resetFields(MegaBean m) {         m.setAuthor(null);         putCurrentUser(m);         m.setCreatedAt(null);         m.setId(null);         m.setMessage(null);         m.setTitle(null);     }     \/**      * JAX-RS and JAX-WS APIs have different lifecycle, for JAX-WS, an EntityManager will be injected by CDI,      *  but for JAX-RS is not (not for all servers).      *  So we need some selection logic here      *\/     private EntityManager selectEm() {         \/\/ if EntityManager was not injected         if (this.em!=null) return this.em;         \/\/ take instance from servlet context         return ((MegaBean) servletContext.getAttribute(\"mega\")).em;     }     \/**      * Get current user from principal      * @return      *          current user's name      *\/     public static String getCurrentUser() {         final FacesContext ctx = FacesContext.getCurrentInstance();         \/\/ if there is no faces context - could happen if current bean was not created by JSF         if (ctx==null || ctx.getExternalContext()==null)             return null;         \/\/ get principal (the standard way) from current context         final java.security.Principal p = ctx.getExternalContext().getUserPrincipal();         return p == null ? null : p.getName();     }     \/**      * Set current user's name to author field of our bean instance      * @param instance      *          an instance of MegaBean, used as DTO      *\/     private static void putCurrentUser(MegaBean instance) {         final String username = getCurrentUser();         if (username!=null)             instance.setAuthor(username);     }     \/**      * Reads JSF version details and store as attribute of ServletContext      * @param sc      *\/     private static void addVersionEnv(ServletContext sc) {         final Package facesPackage = FacesContext.class.getPackage();         final StringBuilder sb = new StringBuilder();         if (sc.getServerInfo() !=null)             sb.append(sc.getServerInfo());         if (facesPackage.getImplementationVersion()!=null)             sb.append(facesPackage.getImplementationVersion());         sc.setAttribute(\"versionLine\", sb.toString());         LOG.info(sb.toString());     }     \/\/ credentials store, not used under Wildfly\/OpenLiberty     private static final Map&lt;String, Map&lt;String, Object&gt;&gt; USERS = new TreeMap&lt;&gt;();     static {         final Map&lt;String, Object&gt; admin_user = new HashMap&lt;&gt;();         admin_user.put(\"password\", \"admin\");         admin_user.put(\"roles\", new String[]{\"admin\", \"user\", \"demo\"});         USERS.put(\"admin@test.org\", admin_user);         final Map&lt;String, Object&gt; s_user = new HashMap&lt;&gt;();         s_user.put(\"password\", \"user\");         s_user.put(\"roles\", new String[]{\"user\"});         USERS.put(\"user@test.org\", s_user);     }      \/\/ ordinary JUL logger, will not be serialized\/persisted     private static final Logger LOG = Logger.getLogger(\"MEGA\"); } <\/code><\/pre>\n<p>\u0412\u044b\u0434\u043e\u0445\u043d\u0443\u043b\u0438, \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u0438 \u0445\u043b\u0435\u0431\u043d\u0443\u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u043e\u043b\u0430? \u0417\u043d\u0430\u0447\u0438\u0442 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u0430 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0438\u0447\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 3. \u041f\u0440\u0435\u043f\u0430\u0440\u0438\u0440\u0443\u044f \u0434\u0438\u0447\u044c<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441\u00a0\u0436\u0435\u043c\u0447\u0443\u0436\u0438\u043d\u044b \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u043c\u044b\u0441\u043b\u0438\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f JPA Entity \u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0Entity <strong>\u0432\u00a0\u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435<\/strong>:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"t_records\") @NamedQueries({     @NamedQuery(name = \"MegaBean.getAllRecords\",             query = \"SELECT m FROM MegaBean m order by m.id desc\") }) @Named .. \/\/ \u043d\u0438\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435 @Transient @PersistenceContext(unitName = \"megaPU\") private EntityManager em; .. \/\/ \u0435\u0449\u0435 \u043d\u0438\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435 final MegaBean r = new MegaBean(); r.setCreatedAt(new Date()); r.setAuthor(\"system@test.org\"); r.setMessage(\"Test message\"); r.setTitle(\"Test title\"); em.merge(r); ..<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u043c\u044b\u0441\u043b\u044c \u043e\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u00a0\u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u0438\u0434\u0442\u0438 \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0443 \u043f\u0441\u0438\u0445\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u043c\u0443 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u043c\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u0443 \u044f\u0432\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u043b\u0438 <s>\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0435 \u0433\u0440\u0438\u0431\u044b<\/s>.<\/p>\n<p>\u041d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:  <\/p>\n<blockquote>\n<p>\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0430<\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e\u00bb.<\/p>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Entity<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 entity JPA, <code>@Table<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, <code>@NamedQueries<\/code> \u0438 <code>@NamedQuery<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0435 JPQL-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u0437 \u0431\u0430\u0437\u044b &#8212; \u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u0434\u0440\u0443\u0433\u0438\u0445, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p>\u0410 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u0430\u044f \u0448\u0438\u0437\u0430: <\/p>\n<blockquote>\n<p>\u0432 \u044d\u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Named<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0431\u0438\u043d CDI, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<\/blockquote>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 CDI \u0447\u0435\u0441\u0442\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043f\u0430\u0439\u043a\u0443 \u0438\u00a0\u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>EntityManager<\/code>, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438 JPA \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0431\u0438\u043d\u0430. \u041a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0447\u0442\u043e \u0438\u00a0\u0441\u0430\u043c\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u044e\u0434\u0430:<\/p>\n<pre><code class=\"java\">@Transient @PersistenceContext(unitName = \"megaPU\") private EntityManager em;<\/code><\/pre>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Transient<\/code> \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 CDI \u043f\u043e\u043b\u0435 \u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 JPA.<\/p>\n<h4>Servlet API<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 <s>\u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0441\u0438\u0445\u0438\u0430\u0442\u0440\u0438\u0438<\/s> \u0431\u043b\u043e\u043a \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043d\u0430\u0434\u0440\u0443\u0433\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043d\u0430\u0434 Servlet API:<\/p>\n<pre><code class=\"java\">@Dependent @WebFilter(\"\/*\") @WebListener<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e\u00a0\u0436\u0435 \u0442\u0430\u043a \u0442\u043e\u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e\u00a0\u2014 \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>@RequestScoped,@SessionScoped \u0438\u043b\u0438 @ApplicationScoped<\/code>\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 Servlet API \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0442\u043b\u0443\u043f \u0430\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043f\u0430\u0434\u0435\u0442 \u043f\u0440\u0438\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430 \u0434\u0438\u0447\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0\u2014 \u00ab\u0432\u043e\u043b\u0448\u0435\u0431\u043d\u0430\u044f\u00bb \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Dependent<\/code>, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e (\u0438\u0437\u00a0\u043c\u043e\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433) \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0441\u043b\u044b\u0448\u0430\u043b.<\/p>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 <a href=\"https:\/\/jakarta.ee\/learn\/docs\/jakartaee-tutorial\/current\/cdi\/cdi-basic\/cdi-basic.html#_using_scopes\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e<\/a>:<\/p>\n<blockquote>\n<p>The default scope if none is specified; it means that an object exists to serve exactly one client (bean) and has the same lifecycle as that client (bean).<\/p>\n<\/blockquote>\n<p>\u0412\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 (\u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 scope) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435. \u0420\u0430\u0437\u0433\u0430\u0434\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <a href=\"https:\/\/github.com\/payara\/Payara\/blob\/main\/appserver\/web\/web-glue\/src\/main\/java\/com\/sun\/enterprise\/web\/WebContainer.java#L3074\" rel=\"noopener noreferrer nofollow\">validateJSR299Scope<\/a>, \u0430\u043d\u0430\u043b\u043e\u0433 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Jakarta API.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u043d\u0430\u0440\u043d\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <code>@Named<\/code> \u0438\u00a0<code>@Dependent<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0438\u043d\u0430 \u0434\u043b\u044f Jakarta Faces \u0438\u00a0\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438\u0437\u00a0Servlet API\u00a0\u2014 \u043d\u0430\u00a0\u043e\u0434\u043d\u043e\u043c \u0438\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<p>\u0422\u0443\u0442 \u043f\u043e\u043c\u0438\u043c\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b:<\/p>\n<pre><code class=\"java\">.. public class MegaBean extends Application implements Serializable,         jakarta.servlet.Filter,         ServletContextListener, ..      <\/code><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c. <\/p>\n<p>\u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>ServletContextListener<\/code> \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code>contextInitialized<\/code>, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f:<\/p>\n<pre><code class=\"java\">.. @Override @WebMethod(exclude = true) @Transactional(Transactional.TxType.REQUIRED) public void contextInitialized(ServletContextEvent sce) {         final ServletContext sc = sce.getServletContext();         \/\/ due to CDI vs servlet conflict         sc.setAttribute(\"mega\", this);         \/\/ we can make it only here due to stackoverflow error          \/\/ in eclipselink         this.current = new MegaBean();         \/\/ reset fields back to nulls - to have working JSR303 validation         resetFields(this.current);         \/\/ populate JSF version details         addVersionEnv(sc);         \/\/ try to add some initial data if database is empty         try {             if (fetchRecordsCount() == 0) {                 \/\/create test entity                 final MegaBean r = new MegaBean();                 r.setCreatedAt(new Date());                 r.setAuthor(\"system@test.org\");                 r.setMessage(\"Test message\");                 r.setTitle(\"Test title\");                 em.merge(r);                 LOG.info(String                 .format(\"automatically added default record: %d\",                  r.getId()));             }         } catch (Exception e) {             LOG.log(Level.WARNING,                     String.format(\"Exception on startup: %s\",                      e.getMessage()), e);         } } ..   <\/code><\/pre>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code>contextInitialized<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0437\u0443.<\/p>\n<h4>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0442\u0431\u0438\u0442\u043e\u0441\u0442\u0438, \u0445\u043e\u0442\u044f \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u0430\u0431\u044b\u0439 \u0447\u0435\u043c \u0438\u0434\u0435\u044f \u0441 JPA \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435:<\/p>\n<blockquote>\n<p>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u0438\u043b\u0430\u043c\u0438 \u043e\u0434\u043d\u0438\u0445 \u043b\u0438\u0448\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439.<\/p>\n<\/blockquote>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0440\u0430\u0441\u043e\u0442 Spring Boot \u044d\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f <s>\u043a\u0430\u043a\u00a0\u0436\u0430\u043b\u043a\u0430\u044f \u043f\u0430\u0440\u043e\u0434\u0438\u044f<\/s> \u0443\u0436\u0435 \u043d\u0435\u00a0\u0442\u0430\u043a, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e\u00a0Jakarta\u00a0\u2014 API, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0418 \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"java\">.. @CustomFormAuthenticationMechanismDefinition(         loginToContinue = @LoginToContinue(                 loginPage = \"\/index.xhtml?login=true\",                 useForwardToLogin = false,                 errorPage = \"\/index.xhtml?login=true&amp;error=true\"         ) ) \/\/ used only when embedded IdentityStore in use @jakarta.annotation.security.DeclareRoles({\"admin\", \"user\", \"demo\"}) ..<\/code><\/pre>\n<p><a href=\"https:\/\/javaee.github.io\/security-api\/apidocs\/javax\/security\/enterprise\/authentication\/mechanism\/http\/CustomFormAuthenticationMechanismDefinition.html\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0440\u0445\u043d\u044f\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f<\/a> \u00ab\u043b\u043e\u0448\u0430\u0434\u0438\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u00bb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\u00a0\u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 form-based \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0438\u0436\u043d\u044f\u044f <code>@DeclareRoles<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0440\u043e\u043b\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <a href=\"https:\/\/openejb.apache.org\/jakartaee-8.0\/javadoc\/javax\/annotation\/security\/DeclareRoles.html\" rel=\"noopener noreferrer nofollow\">@DeclareRoles<\/a> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 <code>IdentityStore<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u0441\u0435\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<h4>\u041e\u0442\u0431\u0438\u0442\u044b\u0439 API<\/h4>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0432\u0443\u0445 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 <s>\u0447\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438<\/s> \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041d\u0430 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0432\u0435\u0448\u0430\u043d\u043e \u0434\u0432\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043f\u0435\u0440\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0438\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u0430 JAX-WS (\u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 SOAP \u0441 XML):<\/p>\n<pre><code class=\"java\">@WebService<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043a\u0440\u044b\u0442 \u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">@WebMethod(exclude = true) public String getAuthor() { return author; }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e JAX-RS \u0438 \u0441 \u043d\u0438\u043c \u0432\u0441\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435:<\/p>\n<pre><code class=\"java\">@ApplicationPath(\"api\") @Path(\"\") @jakarta.ws.rs.ext.Provider<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 <code>@ApplicationPath<\/code> \u0438 <code>@Path<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0442\u043e\u0447\u043d\u043e \u0432\u0438\u0434\u0435\u043b\u0438 <a href=\"https:\/\/www.oracle.com\/technical-resources\/articles\/java\/jax-rs.html\" rel=\"noopener noreferrer nofollow\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445<\/a> \u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <a href=\"https:\/\/jakartaee.github.io\/rest\/apidocs\/2.1.6\/javax\/ws\/rs\/ext\/Provider.html\" rel=\"noopener noreferrer nofollow\">@Provider<\/a>.<\/p>\n<p>\u041d\u0443\u0436\u043d\u0430 \u043e\u043d\u0430 \u0440\u0430\u0434\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>toResponse<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"java\">@Override @WebMethod(exclude = true) public Response toResponse(Exception e) {     LOG.log(Level.WARNING, String.format(\"Exception on call : %s\",                                                     e.getMessage()), e);         return Response.status(400).entity(e.getMessage())                 .type(\"text\/plain\").build(); }<\/code><\/pre>\n<p>\u0421\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u00a0\u043e\u0448\u0438\u0431\u043a\u0435, \u0430\u00a0\u043d\u0435\u00a0\u0430\u0434\u043e\u0432\u044b\u0439 <s>\u0442\u0440\u0435\u0448<\/s> \u0442\u0440\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u00a0\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u00a0\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. <\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 4. \u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u043e\u0442\u0431\u0438\u0442\u043e\u0439 \u0434\u0438\u0447\u0438<\/h3>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u0432 <a href=\"https:\/\/github.com\/alex0x08\/madjavaee.git\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 Github<\/a>, \u0441\u0431\u043e\u0440\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Apache Maven:<\/p>\n<pre><code class=\"bash\">mvn clean package<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f <a href=\"https:\/\/openjdk.org\/index.html\" rel=\"noopener noreferrer nofollow\">OpenJDK<\/a> 21, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<blockquote>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<\/blockquote>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430\u0448\u0435 \u00ab\u0447\u0443\u0434\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u00bb \u0432\u00a0\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438\u00a0\u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <a href=\"https:\/\/openliberty.io\/guides\/maven-intro.html#getting-started\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433<\/a> Maven:<\/p>\n<pre><code class=\"bash\">mvn liberty:run<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 <a href=\"https:\/\/openliberty.io\/\" rel=\"noopener noreferrer nofollow\">OpenLiberty<\/a>, \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0442\u0443\u0434\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0421\u0423\u0411\u0414 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 <a href=\"https:\/\/db.apache.org\/derby\/\" rel=\"noopener noreferrer nofollow\">Apache Derby<\/a>, \u0437\u0430\u00a0\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c Payara, \u0433\u0434\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f H2.<\/p>\n<h4>Open Liberty \/ IBM Websphere Liberty<\/h4>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/openliberty.io\/start\/\" rel=\"noopener noreferrer nofollow\">OpenLiberty<\/a> \u044d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0430\u044f\u00a0IBM. \u0415\u0435\u00a0\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/www.ibm.com\/products\/cloud-pak-for-applications\/liberty\" rel=\"noopener noreferrer nofollow\">IBM Websphere Liberty<\/a> \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0430 \u00ab\u0431\u043e\u043b\u044c\u0448\u043e\u0439\u00bb Websphere \u0438\u00a0\u043e\u0441\u043d\u043e\u0432\u0430 \u0432\u0441\u0435\u0445 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 IBM, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 Websphere.<\/p>\n<blockquote>\n<p>\u0412\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432 Open Liberty, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 IBM Websphere Liberty, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0430\u044f \u0438 \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430.<\/p>\n<\/blockquote>\n<p>\u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0434\u043b\u044f IBM Websphere Liberty.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c Open Liberty \u0432\u0435\u0440\u0441\u0438\u0438 <code>25.0.0.5<\/code> \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c Jakarta 10, \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0432 \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e <a href=\"https:\/\/public.dhe.ibm.com\/ibmdl\/export\/pub\/software\/openliberty\/runtime\/release\/25.0.0.5\/openliberty-jakartaee10-25.0.0.5.zip\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0448\u0430 \u00ab\u0430\u0434\u0441\u043a\u0430\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u0430\u044f\u00bb \u0431\u0443\u0434\u0443\u0447\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432\u00a0Open Liberty:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/888\/4be\/d08\/8884bed081c71896734b9ed00896d5e3.gif\" width=\"800\" height=\"487\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/888\/4be\/d08\/8884bed081c71896734b9ed00896d5e3.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/888\/4be\/d08\/8884bed081c71896734b9ed00896d5e3.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u00a0\u2014 \u0437\u0430\u0434\u0430\u0442\u044c \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u00a0\u043f\u0443\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u00a0\u0431\u0430\u0437\u0435.<\/p>\n<blockquote>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e OpenLiberty \u043d\u0435 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 <code>IdentityStore<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u0431\u0438\u043d\u0435 \u0440\u0430\u0434\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. <\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430\u0434\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b <code>server.xml<\/code> \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435:<\/p>\n<pre><code>wlp\/usr\/servers\/defaultServer\/server.xml<\/code><\/pre>\n<p>\u0433\u0434\u0435 <code>wlp<\/code>\u00a0\u2014 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e Open Liberty.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u043b\u043e\u043a:<\/p>\n<pre><code class=\"xml\">&lt;basicRegistry id=\"basic\" realm=\"WebRealm\"&gt;         &lt;user name=\"admin@test.org\" password=\"admin\"\/&gt;         &lt;group name=\"admin\"&gt;             &lt;member name=\"admin\"\/&gt;         &lt;\/group&gt;        &lt;\/basicRegistry&gt;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0443\u043b\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a \u0431\u0430\u0437\u0435:<\/p>\n<pre><code class=\"xml\">&lt;dataSource id=\"DefaultDataSource\"&gt;         &lt;jdbcDriver libraryRef=\"phlegethLib\"\/&gt;         &lt;properties.derby.embedded createDatabase=\"create\"                                         databaseName=\"shuggDB\"\/&gt;         &lt;containerAuthData password=\"y'hah\" user=\"tharanak\"\/&gt; &lt;\/dataSource&gt;  &lt;library id=\"phlegethLib\"&gt;         &lt;file name=\"${server.config.dir}\/lib\/global\/jdbc\/derby.jar\"\/&gt;         &lt;file name=\"${server.config.dir}\/lib\/global\/jdbc\/derbyshared.jar\"\/&gt; &lt;\/library&gt;<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c JDBC-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f Derby \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433:<\/p>\n<pre><code>wlp\/usr\/servers\/defaultServer\/lib\/global\/jdbc<\/code><\/pre>\n<p>WAR-\u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0448\u0435\u0439 \u0430\u0434\u0441\u043a\u043e\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 <code>dropins<\/code>:<\/p>\n<pre><code class=\"bash\">cp \/opt\/work\/serial-experiments\/madjpa\/target\/*.war wlp\/sr\/servers\/defaultServer\/dropins\/<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443:<\/p>\n<p><a href=\"http:\/\/localhost:9080\/madjavaee-1.0.1-RELEASE\/index.xhtml\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:9080\/madjavaee-1.0.1-RELEASE\/index.xhtml<\/a><\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0448\u0435:<\/p>\n<blockquote>\n<p>\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f OpenLiberty \u043d\u0435 \u0434\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e JAX-RS \u0438 JAX-WS \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<\/blockquote>\n<p>\u0425\u043e\u0442\u044f \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043f\u0440\u043e\u043a\u0430\u0442\u044b\u0432\u0430\u043b\u043e.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <code>@WebService<\/code> \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f JAX-WS \u043b\u0438\u0431\u043e \u043d\u0430\u0431\u043e\u0440 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 JAX-RS:<\/p>\n<pre><code class=\"java\">@ApplicationPath(\"api\") @Path(\"\") @jakarta.ws.rs.ext.Provider<\/code><\/pre>\n<p>\u0415\u0449\u0435 OpenLiberty \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/cxf.apache.org\/docs\/jaxrs-services-description.html\" rel=\"noopener noreferrer nofollow\">WADL-\u0444\u0430\u0439\u043b<\/a> \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c JAX-RS \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u0438\u0442\u043e\u0439. <\/p>\n<h4>Wildfly<\/h4>\n<p><a href=\"https:\/\/www.wildfly.org\/\" rel=\"noopener noreferrer nofollow\">Wildfly<\/a> (\u0432\u00a0\u0434\u0435\u0432\u0438\u0447\u0435\u0441\u0442\u0432\u0435 JBoss)\u00a0\u2014 \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u00a0\u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439.<\/p>\n<p>\u0425\u043e\u0442\u044f \u044d\u0442\u043e\u00a0\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u0430\u043a \u0438\u00a0\u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439\u00a0IBM (Websphere Liberty) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u043d\u0430\u00a0\u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435\u00a0\u2014 Red Hat <a href=\"https:\/\/www.redhat.com\/en\/technologies\/jboss-middleware\/application-platform\" rel=\"noopener noreferrer nofollow\">JBoss Enterprise Application Platform.<\/a><\/p>\n<p>\u041a\u0430\u043a \u0438\u00a0\u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u00a0OpenLiberty, \u0441\u043c\u044b\u0441\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f Wildfly\u00a0\u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u00a0\u043e\u0431\u043a\u0430\u0442\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u043c\u044c\u044e\u043d\u0438\u0442\u0438, \u0441\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0434\u0430\u0436\u0435\u0439 <s>\u0433\u043e\u044f\u043c<\/s> \u0432\u00a0\u0432\u0438\u0434\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0437\u0430\u00a0\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439 \u043f\u0440\u0430\u0439\u0441.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f Wildfly <a href=\"http:\/\/36.0.1.Final\" rel=\"noopener noreferrer nofollow\"><code>36.0.1.Final<\/code><\/a>, \u0430\u0440\u0445\u0438\u0432 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e <a href=\"https:\/\/github.com\/wildfly\/wildfly\/releases\/download\/36.0.1.Final\/wildfly-36.0.1.Final.zip\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0448\u0435 \u0447\u0443\u0434\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Wildfly:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e6c\/11b\/4c4\/e6c11b4c43b507c35dbe0d313d62e190.gif\" width=\"800\" height=\"432\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e6c\/11b\/4c4\/e6c11b4c43b507c35dbe0d313d62e190.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e6c\/11b\/4c4\/e6c11b4c43b507c35dbe0d313d62e190.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u00a0Wildfly \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u0440\u043e\u0449\u0435\u00a0\u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c WAR-\u0444\u0430\u0439\u043b \u0441\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0432\u00a0\u043a\u0430\u0442\u0430\u043b\u043e\u0433:<\/p>\n<pre><code>wildfly\/standalone\/deployments<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Apache Derby, JDBC-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438 \u043f\u0443\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.<\/p>\n<p>\u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Wildfly (\u043d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438) \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u00a0\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 <code>IdentityStore<\/code>\u00a0\u2014 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u043e\u043c\u0435\u043d JASPIC \u0443\u0431\u0440\u0430\u043b\u0438 \u0432\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <code>bin\/<\/code><a href=\"http:\/\/add-user.sh\" rel=\"noopener noreferrer nofollow\"><code>add-user.sh<\/code><\/a><\/p>\n<p>\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443:<\/p>\n<p><a href=\"http:\/\/localhost:8080\/madjpa\/index.xhtml\" rel=\"noopener noreferrer nofollow\">http:\/\/localhost:8080\/madjpa\/index.xhtml<\/a><\/p>\n<h4>Eclipse Glassfish<\/h4>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d <a href=\"https:\/\/glassfish.org\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0447\u0435\u043d\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442<\/a> \u0441 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439, \u043d\u0435\u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0441\u0430\u043c\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Sun Microsystems \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 J2EE.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f <code>7.0.25<\/code> \u0441\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c Jakarta EE\u00a0Platform, \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0432 \u0441\u043e\u00a0\u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u00a0<a href=\"https:\/\/www.eclipse.org\/downloads\/download.php?file=\/ee4j\/glassfish\/glassfish-7.0.25.zip\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Glassfish:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a3\/299\/735\/8a3299735b158a9393cea6781a3b17cc.gif\" width=\"800\" height=\"549\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a3\/299\/735\/8a3299735b158a9393cea6781a3b17cc.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a3\/299\/735\/8a3299735b158a9393cea6781a3b17cc.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>bin\/startserv<\/code><\/p>\n<p>Glassfish \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 \u043f\u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 <code>IdentityStore<\/code> (\u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u00a0\u0431\u0438\u043d \u0443\u0447\u0435\u0442\u043a\u0438) \u0438\u00a0\u043f\u0443\u043b \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u00a0Apache Derby \u0438\u00a0\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 JAX-WS \u0438\u00a0JAX-RS \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430\u00a0\u043e\u0434\u043d\u043e\u043c \u0438\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0435. <\/p>\n<p>\u0418 \u0434\u0430\u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e WADL-\u0444\u0430\u0439\u043b\u0430 \u043e\u043d \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8d0\/03d\/483\/8d003d483d40222baabe3f09d785495c.png\" width=\"1285\" height=\"937\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8d0\/03d\/483\/8d003d483d40222baabe3f09d785495c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8d0\/03d\/483\/8d003d483d40222baabe3f09d785495c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044f\u0440\u043a\u0430\u044f \u0434\u0438\u0447\u044c\u00a0\u2014 \u0437\u0430\u00a0\u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0445\u0435\u0440\u043e\u043c \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440 Apache Derby, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>asadmin<\/code> \u0438\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code>start-database<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/232\/524\/0f3\/2325240f3382c8469e736df56b174545.png\" width=\"810\" height=\"391\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/232\/524\/0f3\/2325240f3382c8469e736df56b174545.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/232\/524\/0f3\/2325240f3382c8469e736df56b174545.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>Payara<\/h4>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0432 \u043d\u0430\u0448\u0438\u0445 \u043a\u0440\u0430\u044f\u0445 <a href=\"https:\/\/www.payara.fish\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0435\u043a\u0442 Payara<\/a>:<\/p>\n<blockquote>\n<p>When commercial support for GlassFish ended in 2014, Payara Server was created as a fully-supported drop-in replacement. Payara Services was born in 2016 to offer support solutions for the application server.<\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0442\u043e\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0447\u0442\u043e \u0443 Glassifsh \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u043b\u0438 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043f\u043e \u0437\u043e\u0432\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c Payara.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f Payara Server <code>6.2025.5<\/code> \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c Full, \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e <a href=\"https:\/\/www.payara.fish\/downloads\/payara-platform-community-edition\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code>bin\/asadmin start-domain<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/72b\/730\/400\/72b730400b36ec2640045b9ba18cf1ad.gif\" width=\"800\" height=\"481\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/72b\/730\/400\/72b730400b36ec2640045b9ba18cf1ad.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/72b\/730\/400\/72b730400b36ec2640045b9ba18cf1ad.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u00a0\u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c, \u0431\u0430\u0437\u0430 (H2) \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 <code>IdentityStore<\/code> \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u00a0\u0431\u0438\u043d\u0430 \u0438\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u0430 \u0442\u0438\u043f\u0430 \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u00a0\u2014 JAX-RS \u0438\u00a0JAX-WS, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<h3>\u042d\u043f\u0438\u043b\u043e\u0433<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437\u00a0\u0441\u0442\u0430\u0442\u0435\u0439, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0430\u0432\u0442\u043e\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u0438 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e\u00a0\u043d\u0435\u00a0\u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u00ab\u0442\u0435\u0445\u043d\u043e\u0435\u0440\u0435\u0441\u044c\u00bb \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0441\u0438\u0445\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0434\u043e\u0440\u043e\u0432\u044b\u043c \u043b\u044e\u0434\u044f\u043c.<\/p>\n<blockquote>\n<p>\u0425\u0440\u0430\u0431\u0440\u044b\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442 (\u0434\u0430\u00a0\u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c) \u0432\u0441\u0435\u00a0\u0436\u0435 \u0442\u0432\u043e\u0440\u0438\u043b \u0441\u0432\u043e\u044e \u043b\u044e\u0442\u0443\u044e \u043c\u0435\u0441\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e.<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0435\u0433\u043e \u00ab\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0434\u0436\u0438\u0445\u0430\u0434\u0430\u00bb \u043f\u043e\u0434 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0438 Java \u0437\u0430\u043d\u044f\u043b\u0430 \u0432\u00a0\u0438\u0442\u043e\u0433\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u00a0\u0442\u0435\u0441\u0442\u043e\u0432\u00a0\u2014 \u0432\u0441\u0435 \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043e\u0449\u0443\u0442\u0438\u043b\u0438 \u043d\u0430\u00a0\u0441\u0435\u0431\u0435 \u0441\u00a0\u043a\u0430\u043a\u0438\u043c\u0438 \u0443\u0436\u0430\u0441\u0430\u043c\u0438 \u043e\u0442 \u043c\u0438\u0440\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e.<\/p>\n<p>\u041d\u0435\u00a0\u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0432\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445\u00a0\u2014 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u0430\u0432\u0435\u0434\u043d\u044b\u0439 \u0433\u043d\u0435\u0432, \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c <s>\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0445 \u0433\u0440\u0438\u0431\u043e\u0432<\/s>.<\/p>\n<p>\u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u0442\u0435\u0441\u044c \u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u043d\u0430\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u00a0\u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0441\u0438\u0445\u0438\u043a\u0443 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0432\u00a0\u0434\u0435\u0432\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435\u00a0\u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442\u0435 \u0437\u043d\u0430\u0442\u044c \u043a\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<p>\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u0435, \u043c\u0435\u043d\u0435\u0435 \u0446\u0435\u043d\u0437\u0443\u0440\u043d\u044b\u0439 <a href=\"https:\/\/blog.0x08.ru\/mad-java-ee\" rel=\"noopener noreferrer nofollow\">\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b<\/a> \u0441 \u0441\u0430\u0443\u043d\u0434\u0442\u0440\u0435\u043a\u043e\u043c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u0433\u0435.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/916450\/\"> https:\/\/habr.com\/ru\/articles\/916450\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043f\u0440\u0438\u0433\u043e\u0440\u043e\u0434\u0435 \u0434\u0430\u043b\u0435\u043a\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D1%8C%D1%8E-%D0%94%D0%B5%D0%BB%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041d\u044c\u044e-\u0414\u0435\u043b\u0438<\/a> \u0436\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0435\u043d\u0435\u043a \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442. \u041b\u044e\u0431\u0438\u043b \u043e\u043d \u043c\u0430\u043c\u0443, \u041a\u0440\u0438\u0448\u043d\u0443 \u0438 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u043c\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c\u0438 \u0433\u0440\u0438\u0431\u0430\u043c\u0438. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0440\u0438 \u0433\u0440\u0430\u043d\u0438 \u0431\u0435\u0437\u0443\u043c\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435.<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0441\u043e\u0431\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u043d\u0438\u0440\u0432\u0430\u043d\u0443, \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0439 \u0433\u0440\u0438\u0431 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u043c\u0443 \u043f\u0430\u0440\u0435\u043d\u044c\u043a\u0443 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u043e\u0436\u0434\u0435\u043d \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u00a0\u0431\u044b\u043b \u0440\u0430\u0434\u0438 \u0432\u0435\u043b\u0438\u043a\u043e\u0439 \u0446\u0435\u043b\u0438: <\/p>\n<blockquote>\n<p>\u043c\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u043b\u044b\u043c \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u043c \u0437\u0430\u00a0\u0433\u043e\u0434\u044b \u0440\u0430\u0431\u0441\u0442\u0432\u0430 \u0438\u00a0\u0443\u0433\u043d\u0435\u0442\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0440\u043e\u0434\u0430.<\/p>\n<\/blockquote>\n<p>\u2014\u00a0\u041e\u00a0\u044e\u043d\u044b\u0439 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442! \u2014\u00a0\u043c\u043e\u043b\u0432\u0438\u043b \u0433\u0440\u0438\u0431. <\/p>\n<p>\u2014\u00a0\u041f\u043e\u043c\u043d\u0438 \u0447\u0442\u043e \u00ab\u0432\u0435\u0440\u0430 \u0431\u0435\u0437 \u0434\u0435\u043b \u043c\u0435\u0440\u0442\u0432\u0430\u00bb. \u0411\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u00a0\u2014\u00a0\u0412\u0440\u0430\u0433 \u0445\u0438\u0442\u0435\u0440 \u0438\u00a0\u043a\u043e\u0432\u0430\u0440\u0435\u043d, \u0441\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0442\u0430\u0439\u043d\u043e \u0438\u00a0\u0435\u0433\u043e\u00a0\u0436\u0435 \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<p>\u041f\u0440\u043e\u0448\u043b\u0438 \u0433\u043e\u0434\u044b, \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f. <\/p>\n<p>\u041f\u0430\u0440\u0435\u043d\u0435\u043a \u0432\u044b\u0443\u0447\u0438\u043b \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0412\u0423\u0417 \u0438\u00a0\u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b \u043d\u0430\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u00a0\u043a\u0440\u0443\u043f\u043d\u0443\u044e \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u00ab\u0431\u0435\u043b\u044b\u0435 \u0432\u0430\u0440\u0432\u0430\u0440\u044b\u00bb \u0438\u0437 \u0434\u0430\u043b\u0435\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b \u0437\u0430\u00a0\u043e\u043a\u0435\u0430\u043d\u043e\u043c \u0437\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041d\u043e\u00a0\u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u043b \u0445\u0440\u0430\u0431\u0440\u044b\u0439 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u00a0\u2014 \u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u044b\u043d \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u043d\u0430\u0440\u043e\u0434\u0430 \u043d\u0430\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0433\u043e \u0433\u0440\u0438\u0431\u0430 \u0438\u00a0\u0434\u043e\u0441\u043b\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u0434\u043e\u00a0\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 <strong>\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u0430<\/strong> \u043d\u0430\u0447\u0430\u043b \u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0436\u0435\u0441\u0442\u043e\u043a\u0443\u044e \u043c\u0435\u0441\u0442\u044c,\u00a0\u0441\u0440\u0430\u0436\u0430\u044f\u0441\u044c \u0441\u00a0\u00ab\u0431\u0435\u043b\u044b\u043c\u0438 \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u043c\u0438\u00bb \u0438\u0445\u00a0\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<hr\/>\n<p>\u041f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u00a0\u0441\u0442\u043e\u043b\u044c \u043f\u043e\u044d\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0432\u043e\u0434\u043d\u0443\u044e, \u043d\u043e\u00a0\u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u00a0\u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e <strong>\u043b\u044e\u0442<\/strong>, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0432\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0441\u0438\u0445\u043e\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0434 \u044d\u0442\u043e \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u044b\u0441\u043b\u0438 \u0432\u00a0\u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u00a0\u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0448\u0438\u0437\u043e\u0444\u0440\u0435\u043d\u0438\u0438. <\/p>\n<\/blockquote>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u00a0\u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435: \u043a\u043e\u043b\u043b\u0435\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u043c \u0443\u0437\u0440\u0435\u043b <strong>\u044d\u0442\u043e<\/strong> \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0440\u043e\u0441\u0438\u043b \u043f\u0438\u0442\u044c \u0438\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u00a0\u043f\u043e\u043b\u043d\u043e\u0439\u00a0\u0437\u0430\u0432\u044f\u0437\u043a\u0435 \u0434\u043e\u00a0\u0441\u0438\u0445\u00a0\u043f\u043e\u0440. \u0421\u0435\u0434\u044c\u043c\u043e\u0439\u00a0\u0433\u043e\u0434 \u043f\u043e\u0434\u0440\u044f\u0434.<\/p>\n<p>\u041a\u00a0\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u043c\u0443 \u0431\u0435\u0437\u0443\u043c\u0438\u044e \u043d\u0430\u0434\u043e \u0443\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u0442\u0435\u043e\u0440\u0438\u044e \u0438 \u043c\u0430\u0442\u0447\u0430\u0441\u0442\u044c\u00a0\u2014 \u0434\u043b\u044f\u00a0\u043d\u0435\u043f\u0440\u0438\u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435\u0432\u0438\u043d\u043d\u044b\u0445.<\/p>\n<h4>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0423\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 Java \u0438\u00a0C# \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0449\u044c \u043a\u0430\u043a <em>\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/em>\u00a0\u2014 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c, \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u043c.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">@Configuration @EnableCaching public class CacheConfig {        @Bean     public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(         javax.cache.CacheManager cacheManager) {         return hibernateProperties -&gt; hibernateProperties                 .put(ConfigSettings.CACHE_MANAGER, cacheManager);     }     .. }<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430 @\u00a0\u2014 \u0442\u0435\u00a0\u0441\u0430\u043c\u044b\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0441\u043c\u044b\u0441\u043b\u0430, \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Spring Boot.<\/p>\n<p>\u041d\u043e \u043a\u0443\u0434\u0430 \u0447\u0430\u0449\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c:<\/p>\n<pre><code class=\"java\">\/**  * \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c '\u0437\u0430\u043a\u0430\u0437'  * @since 1.0  * @author 0x08  *\/ @Entity @Table(name = \"strm_orders\") @Indexed public class Order extends AbstractAuditingEntity implements Serializable {     @Id     @GeneratedValue(strategy = GenerationType.SEQUENCE,                      generator = \"order_seq\")     @SequenceGenerator(name = \"order_seq\")     @GenericField     private Long id;     @Column(name = \"customer_id\", nullable = false)     private long customerId;     @Column(name = \"sender_id\", nullable = false)     private long senderId;     @Enumerated(EnumType.STRING)     @Column(name = \"order_status\", nullable = false)     private OrderStatus orderStatus = OrderStatus.NEW; ..<\/code><\/pre>\n<p>\u0412\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Column<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430\u00a0\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0441\u00a0\u043a\u043e\u043b\u043e\u043d\u043a\u043e\u0439 \u0432\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0410\u0442\u0440\u0438\u0431\u0443\u0442 <code>name<\/code> \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438.<\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0441\u0442\u044c, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0438 \u043b\u0438\u0448\u044c <em>\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c <\/em>\u043a\u00a0\u043a\u043b\u0430\u0441\u0441\u0443\u00a0\u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u00a0\u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u043a\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430.  <\/p>\n<p>\u041d\u0438\u043a\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u043c \u0443\u043c\u0435 \u043d\u0435\u00a0\u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u0443\u044e \u0437\u0430\u043c\u0435\u043d\u0443 <strong>\u0432\u0441\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u00a0\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439\u00a0\u2014 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u043c &#171;SOLID rocks&#187;<\/figcaption><\/div>\n<\/figure>\n<h4>SOLID<\/h4>\n<p>\u0412\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u0440\u043c\u0438\u043d <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\" rel=\"noopener noreferrer nofollow\">SOLID<\/a>\u00a0\u2014 \u0430\u043a\u0440\u043e\u043d\u0438\u043c, \u043a\u0430\u0436\u0434\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e:<\/p>\n<ul>\n<li>\n<p>S:  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/a> (single responsibility principle)<\/p>\n<\/li>\n<li>\n<p>O:  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D1%81%D1%82%D0%B8\/%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D1%81%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438\/\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438<\/a> (open-closed principle)<\/p>\n<\/li>\n<li>\n<p>L: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u041b\u0438\u0441\u043a\u043e\u0432<\/a> (Liskov substitution principle)<\/p>\n<\/li>\n<li>\n<p>I: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/a> (interface segregation principle)<\/p>\n<\/li>\n<li>\n<p>D: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B8%D0%BD%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/a> (dependency inversion principle)<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u043a \u0438\u00a0\u043b\u044e\u0431\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f, SOLID\u00a0\u2014 \u00ab\u0437\u0430\u00a0\u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0432\u0441\u0435\u0433\u043e \u043f\u043b\u043e\u0445\u043e\u0433\u043e\u00bb, \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u00a0\u0431\u0443\u043c\u0430\u0433\u0435 (\u0432\u00a0\u043a\u043d\u0438\u0433\u0430\u0445) \u0438\u00a0\u0432\u00a0\u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0440\u0435\u0437\u044e\u043c\u0435, \u043d\u043e\u00a0\u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u00a0\u043d\u0435\u00a0\u0442\u0430\u043a\u0438\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439.<\/p>\n<blockquote>\n<p>\u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c, SOLID \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043e \u043d\u0435\u0443\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u0438, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0432 \u0432 \u043f\u0441\u0438\u0445\u043e\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0436\u0438\u0440\u0430\u043d\u0438\u044f \u043c\u043e\u0437\u0433\u0430 \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0439 \u0433\u0440\u0438\u0431 \u043d\u0430\u0440\u0435\u043a\u0430\u0435\u0442 <strong>\u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u043c<\/strong> \u0438\u00a0\u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u043a\u00a0\u0432\u0435\u043b\u0438\u043a\u043e\u0439 \u043c\u0438\u0441\u0441\u0438\u0438\u00a0\u2014 \u043c\u0441\u0442\u0438\u0442\u044c \u00ab\u0431\u0435\u043b\u044b\u043c \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u043c\u00bb \u0437\u0430\u00a0\u0433\u043e\u0434\u044b \u0443\u0433\u043d\u0435\u0442\u0435\u043d\u0438\u044f \u0438\u0445\u00a0\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0440\u0443\u0436\u0438\u0435\u043c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f IBM Websphere, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c\u044b\u0439 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b.<\/figcaption><\/div>\n<\/figure>\n<h3>\u0427\u0430\u0441\u0442\u044c 0. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0434\u0436\u0438\u0445\u0430\u0434<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0441\u00a0<strong>\u043d\u0435\u0432\u0435\u0434\u043e\u043c\u044b\u043c<\/strong> \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 <s>\u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e<\/s> \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043d\u043e\u00a0\u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430 \u043d\u0430\u0448\u0443 \u0441\u043a\u0443\u0447\u043d\u0443\u044e \u0436\u0438\u0437\u043d\u044c \u0438\u00a0\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u00a0\u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0448\u043a\u043e\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0435 \u0442\u0430\u043b\u0430\u043d\u0442\u0430\u043c:<\/p>\n<blockquote>\n<p>\u043a\u00a0\u043d\u0430\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0441\u044f (\u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u0432) \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u0436\u0435\u043d\u0442\u0435\u043b\u044c\u043c\u0435\u043d \u0441\u00a0\u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0441\u044c\u0431\u043e\u0439 \u00ab\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u00a0\u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u00a0\u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u00bb. <\/p>\n<\/blockquote>\n<p>\u041f\u043e\u0441\u043b\u0430\u0442\u044c \u0434\u0436\u0435\u043d\u0442\u0435\u043b\u044c\u043c\u0435\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043c\u044b\u00a0\u0441\u043e\u0447\u043b\u0438 \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u043c\u00a0\u2014 \u0432\u0441\u0435\u00a0\u0436\u0435 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u0438\u0437 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u043e\u0439 \u0441\u0442\u043e\u043b\u0438\u0446\u044b, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0443\u00a0\u043d\u0435\u0433\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043f\u0440\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445, \u043a\u00a0<strong>\u0442\u0430\u043a\u043e\u043c\u0443 <\/strong>\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u00a0\u0433\u043e\u0442\u043e\u0432\u044b \u0434\u0430\u0436\u0435 \u043c\u044b\u00a0\u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043b\u044e\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0434\u0443\u043c\u0430\u044e \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u044d\u0442\u043e\u0439 \u00ab\u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0443\u0436\u0430\u0441\u043e\u0432\u00bb, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u00a0\u0447\u0435\u043c \u0438\u0434\u0435\u0442 \u0440\u0435\u0447\u044c.<\/p>\n<p>\u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0432\u0432\u0438\u0434\u0443 <s>\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u00a0\u043d\u0435\u0440\u0430\u0437\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0438<\/s> \u0434\u0430\u0432\u043d\u043e \u0443\u0431\u0438\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u00a0\u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043d\u0435\u00a0<s>\u043c\u043e\u0433\u0443<\/s> \u0445\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0438\u0436\u0435\u00a0\u2014 \u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u043f\u043e\u00a0\u043c\u043e\u0442\u0438\u0432\u0430\u043c\u00bb \u0438\u00a0\u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f, \u0445\u043e\u0442\u044f \u0438 \u0437\u0430\u043d\u044f\u0432\u0448\u0430\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 <strong>\u0441\u0435\u043c\u044c \u043b\u0435\u0442<\/strong> \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438.<\/p>\n<blockquote>\n<p>\u0427\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u00a0\u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0443\u0431\u043e\u0439\u043d\u043e\u0441\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432 \u0441\u043c\u0435\u043b\u043e\u0433\u043e \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442\u0430 (\u0434\u0430 \u043d\u0435 \u0442\u0440\u043e\u043d\u0435\u0442 GC \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u044b), \u043f\u043e\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u00a0\u043c\u043e\u0449\u044c \u0435\u0433\u043e \u0432\u0435\u0440\u044b \u0432\u00a0\u0441\u0432\u044f\u0442\u043e\u0435 \u0434\u0435\u043b\u043e \u0431\u043e\u0440\u044c\u0431\u044b \u0441\u00a0\u00ab\u0431\u0435\u043b\u044b\u043c\u0438 \u0443\u0433\u043d\u0435\u0442\u0430\u0442\u0435\u043b\u044f\u043c\u0438\u00bb \u043f\u0443\u0442\u0435\u043c \u0441\u0436\u0438\u0433\u0430\u043d\u0438\u044f \u0438\u0445 \u043c\u043e\u0437\u0433\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0441\u043e\u0431\u043e\u0439 \u0441\u0432\u044f\u0437\u043a\u0443 \u0438\u0437\u00a0<em>\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432<\/em> JEE-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043d\u0430\u00a0\u00ab\u0431\u043e\u043b\u044c\u0448\u043e\u0439\u00bb\u00a0IBM Websphere \u0438\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e Java 8, \u043d\u043e \u0440\u0430\u0434\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f\u00a0\u043c\u044b\u00a0\u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 Jakarta 10, \u0441\u043e\u00a0\u0432\u0441\u0435\u043c\u0438 \u043d\u0430\u0432\u043e\u0440\u043e\u0442\u0430\u043c\u0438 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Java (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0441\u00a0\u0447\u0435\u0433\u043e\u2011\u0442\u043e \u0431\u043e\u043b\u0435\u0435\u2011\u043c\u0435\u043d\u0435\u0435 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e\u0433\u043e, \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u00a0\u0440\u0430\u043c\u043a\u0438 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438: <\/p>\n<pre><code class=\"java\">.. @WebFilter(\"\/*\") @WebListener public class Foo implements Filter,ServletContextListener{      \/\/ \u0432\u0430\u0436\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f   private int someImportantValue = 42;    @Override   public void contextInitialized(ServletContextEvent sce) {            final ServletContext sc = sce.getServletContext();         \/\/ \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441         sc.setAttribute(\"foo\", this);  }  ..     @Override   public void doFilter(ServletRequest sr,                        ServletResponse sr1, FilterChain fc)                              throws IOException, ServletException {                 final ServletContext sc = sr.getServletContext();         \/\/ \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0436\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430         Foo foo = (Foo)sc.getAttribute(\"foo\");                  if (foo.someImportantValue == 42) {            \/\/ \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430                  ..            }     }   .. }<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0445\u0440\u0430\u0431\u0440\u044b\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u0427\u0430\u043d\u0434\u0440\u0430\u043a\u0430\u043d\u0442 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u00a0<s>\u043c\u043e\u043b\u0438\u0442\u0432 \u041a\u0440\u0438\u0448\u043d\u0435<\/s> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043e\u0434\u043d\u0443 \u0438\u00a0\u0442\u0443\u00a0\u0436\u0435 \u043a\u043e\u043f\u0438\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u00a0Servlet API (Filter \u0438\u00a0Listener), \u0441\u00a0\u0440\u0430\u0437\u043d\u044b\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c.<\/p>\n<blockquote>\n<p>\u0421\u0432\u044f\u0437\u0430\u0432 \u0438\u0445\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0441\u00a0\u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c\u044e\u00a0\u2014 \u0440\u0430\u0434\u0438 \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u043e\u0431\u043e\u0435\u0432 \u043c\u043e\u0437\u0433\u0443 \u043d\u0435\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u00ab\u0431\u0435\u043b\u043e\u0433\u043e \u0432\u0430\u0440\u0432\u0430\u0440\u0430\u00bb.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435\u00a0\u044d\u0442\u043e \u0435\u0449\u0435 \u0446\u0432\u0435\u0442\u043e\u0447\u043a\u0438, \u043f\u043e\u00a0\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u043e\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0435\u0434\u0435\u0432\u0440\u043e\u043c \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u043c\u044b\u0441\u043b\u0438, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0439 \u0431\u0435\u0434\u043d\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0440\u043e\u0441\u0438\u043b \u043f\u0438\u0442\u044c:<\/p>\n<pre><code class=\"java\">@Entity @Table(name = \"t_foo\") @NamedQueries({     @NamedQuery(name = \"Foo.fetchAll\",             query = \"SELECT f FROM Foo f order by f.id desc\") }) @Named @RequestScoped public class Foo {      @Id     @SequenceGenerator     @GeneratedValue(strategy = GenerationType.SEQUENCE,                      generator = \"default_gen\")     private Long id;          @Size(min = 3, max = 255)     @Pattern(regexp = \"[a-zA-Z0-9._ -?!]+\")     private String title;          ..      private transient Foo instance;          @Transient     @PersistenceContext     private EntityManager em;          ..          public List&lt;Foo&gt; fetchRecords() {         return this.em.createNamedQuery(\"Foo.fetchAll\",Foo.class).getResultList();     } .. }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0434\u043b\u044f J2EE\/JEE\/Jakarta \u0438\u00a0\u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 JPA, JTA, JSF \u0432\u00a0\u0440\u0430\u0431\u043e\u0442\u0435\u00a0\u2014 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430 \u0432\u0430\u043b\u0438\u0434\u043e\u043b\u043e\u043c.<\/p>\n<blockquote>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438\u00a0\u0443\u0436\u0430\u0441\u044b \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u043e\u0448\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0443\u0442\u044c \u0438 \u0441\u043c\u044b\u0441\u043b.<\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u043a\u043b\u0430\u0441\u0441 <code>Foo<\/code> \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043d\u0430\u0432\u0435\u0448\u0430\u043d\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445  \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c: <\/p>\n<ul>\n<li>\n<p>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (Entity) JPA, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0438\u043d\u0430 CDI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b JSF.<\/p>\n<\/li>\n<\/ul>\n<p>C\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"xml\"> &lt;p&gt;     &lt;ui:repeat value=\"#{foo.fetchRecords()}\" var=\"record\"&gt;                        &lt;div style=\"padding-left: 2em; font-style: italic;\"&gt;                             &lt;h:outputText value=\"#{record.title}\"\/&gt;               &lt;\/div&gt;               ..     &lt;\/ui:repeat&gt; &lt;\/p&gt;<\/code><\/pre>\n<p>\u041d\u043e\u00a0\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0443\u0442 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0435\u0441\u0435\u043b\u0435\u0435\u00a0\u2014 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u00a0\u043f\u043e\u043b\u0435 <code>instance<\/code>:<\/p>\n<pre><code>private transient Foo instance;<\/code><\/pre>\n<p>\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0433\u0443\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435.. DTO!<\/p>\n<p>\u0421\u0447\u0438\u0442\u0430\u044e \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0\u2014 \u0432\u0435\u0440\u0445 \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-462324","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=462324"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462324\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=462324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=462324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=462324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}