Ответы пользователя по тегу Java
  • Как правильно работать с датами в клиент-сервеном приложении?

    @bobzer
    Java EE Developer
    А может и не надо ничего делать вообще? Стандартные типы дат в Java (java.util.Date/Calendar) имеют встроенную обработку временных зон и даже учитывают перевод на зимнее/летнее время. Достаточно в JVM клиентов и сервера в рантайме указать (TimeZone.setDefault) правильную временную зону (обычно она устанавливается автоматически), все остальное Java сделает сама. Вы уверены, что не пытаетесь решить несуществующую проблему?
    Ответ написан
  • Как разместить сервер в интернете?

    @bobzer
    Java EE Developer
    Если у вас на самом деле не "сервер для чата", а Java-приложение, которое разворачивается под управлением существующего сервера приложений, то можете почитать тут: Как развернуть Tomcat на сервере?
    Ответ написан
    Комментировать
  • Поддерживает ли Tomcat java 8? Если нет, то какие контейнеры поддерживают?

    @bobzer
    Java EE Developer
    Насколько я помню, для Java 8 рекомендуется Tomcat 8. Запускал Tomcat 8 под Java 8, разворачивал достаточно комплексное, сложное приложение - работало. Не стал использовать, т.к. первая же протестированная фича Java 8 не заработала в JSF (вина библиотек JSF, а не самого Tomcat). Ну и плюс мой хостинг пока предоставляет только Tomcat 7. Так что если есть возможность в продакшене развернуть Java 8 и Tomcat 8, то почему бы и нет?

    Насчет контейнеров. Tomcat 8 - отличный сервер приложений, на котором можно развернуть практически любое приложение. Но делать это придется ценой самостоятельной интеграции различных фреймворков в свое приложение. Например, чтобы равзернуть веб-сервисы, потребуется разобраться как это сделать, возможно даже развернуть "движок" веб-сервисов. А вот в JBoss (или WildFly) уже развернуто множество фреймворков, и для того, чтобы развернуть веб-сервис, достаточно добавить в свои исходники нужные аннотации, а "движок" веб-сервисов там уже есть.

    В более простом и легковесном Tomcat требуется больше усилий для того, чтобы подключать фреймворки к своему приложению, т.к. кроме непосредственно подключения к приложению, еще требуется развертывание самих фреймворков (обычно это не так уж и сложно, и в Гугле все есть).

    Более "тяжелый" JBoss сделал часть работы за вас, но у этой работы есть своя цена. Во-первых, стек технологий и их версий жестко завязан на конкретную версию JBoss-а: если потребуется развернуть более свежую версию конкретного фреймворка или даже API библиотеки, в большинстве случаев это просто невозможно. Или если ваше приложение использует какое-то-API-v2.jar, а в JBoss-е уже активно используется какое-то-API-v1.jar, то нередко потребуются танцы с бубнами для решения проблем совместимости. Плюс настройки: нередко вместо стандартных настроек фреймворка придется разбираться с их JBoss-овским вариантом.

    Таким образом, для сложных приложений JBoss может дать более быстрый старт, в сравнении с Tomcat-ом. Но впоследствии, когда после старта придет время специфических настроек и требований, JBoss может завести в тупик или, как минимум, заставить серьезно "забуксовать на ровном месте"

    Я, пожалуй, посоветую все же Tomcat
    Ответ написан
    3 комментария
  • Unable to load tag handler class в чем ошибка?

    @bobzer
    Java EE Developer
    Судя по тексту ошибки, сам класс HelloWorld забыли "положить" на сервер, либо он оказался в контексте, недоступном загрузчику классов, который загружает index.jsp. Т.е., либо класса вообще нет на сервере, либо он лежит там, откуда сервер его загрузить не догадался. В HelloWorld-ах классы обычно лежат в папке HelloWorld.war/WEB-INF/classes

    А вообще, JSP - технология давно устаревшая, ее современный вариант - JSF. Начиная со второй версии спецификации создание собственных компонентов (аналог тегов JSP) стало простой задачей...
    Ответ написан
  • Hibernate игнорирует настройки и работает с другой базой. В чём может быть проблема?

    @bobzer
    Java EE Developer
    Независимо от того, какая выбрана система сборки, все они компилируют классы в какую-либо отдельную папку, и обычно в нее же сохраняют дополнительные ресурсы, такие, как hibernate.cfg.xml. Самый простой путь - сделать поиск по файловой системе файла hibernate.cfg.xml и посмотреть его содержимое везде, где он найден. Думаю, что найдется версия с URL-ом "/test"...
    Ответ написан
    Комментировать
  • Можно ли описать связь один ко многим c возможностью изменять поле с внешним ключом?

    @bobzer
    Java EE Developer
    Несмотря на то, что на объектном уровне Hibernate требует объект Group, на самом деле ему для корректного сохранения в БД нужен лишь group_id. Можно создать пустой/фейковый (не считанный из БД) экземпляр Group и указать ему нужный вам group_id. После этого его можно смело передавать в user.setGroup(group); Если количество групп в Системе ограничено и все они известны заранее (подтекст вопроса это подразумевает), то можно хранить как константы экземпляры Group с заполненным полем ID.
    Ответ написан
    5 комментариев
  • JPA и Hibernate или Hibernate?

    @bobzer
    Java EE Developer
    JPA - это интерфейс языка JAVA, не имеющий реализации в самом языке. Если просто добавить аннотации JPA в свои классы, то не произойдет ровным счетом ничего. Для того, чтобы аннотации начали "работать", следует развернуть и настроить в проекте фреймворк, который "найдет" все классы с JPA-аннотациями и "состыкует" их с сущностями СУБД. Этим фреймворком у вас является Hibernate.

    По поводу "работать с hibernate можно и через JPA или отдельно от него" - тут в основном дело вкуса. У вас есть два варианта сообщить Hibernate какие классы "замапить" на таблицы БД:
    1. Добавить в классы аннотации JPA
    2. Создать XML-файлы, в которых будет описано сопоставление классов объектам БД.

    По доступной функциональности оба метода равны между собой, при этом аннотации JPA более современны. Я бы рекомендовал JPA, т.к. при открытии класса сразу будет видно, что он "замаплен", а в случае использования XML, "замапленный" класс визуально неотличим от других классов.
    Ответ написан
    1 комментарий
  • Как реализовать загрузку файла с ftp сервера на java?

    @bobzer
    Java EE Developer
    Скорее всего, операция загрузки завершилась ошибкой, а вы это не проверили. При возникновении ошибок, FTPClient не выбрасывает исключение, а просто сохраняет код ошибки, а вызванный метод возвращает false. При этом исполнение кода продолжается и доходит до корректного закрытия файла, из-за чего вы получаете файл размером 0 байт. Если retrieveFile вернул false, то смотрите ftpClient.getReplyString(), вместо того, чтобы корректно закрывать файл. Например, можно сделать так:
    if(!isDownloaded) {
        throw new Exception(ftpClient.getReplyString());
    }

    При этом конечно не забывать об освобождении ресурсов в блоке finally пока что не существующего в методе блока try...
    Ответ написан
    1 комментарий
  • Миграция с JBoss 6 на JBoss 7 - почему из WAR не виден EJB?

    @bobzer
    Java EE Developer
    проект, состоящий из одного EJB и одного WAR
    В JBoss (и в терминологии серверов приложений JEE в целом) нет понятия "проект". Правильно ли я понимаю, что под "проектом" подразумевается Enterprise Archive (EAR)? Если у вас нет EAR, то я не вижу способов считать чем-то единым отдельный WAR и отдельный EJB-модуль.

    Если есть EAR, попробуйте в папку META-INF добавить файл с именем jboss-deployment-structure.xml со следующим содержанием:
    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure>
        <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    </jboss-deployment-structure>


    Создать EAR можно следующим образом. Создаете в папке deployments папку my.ear со следующей структурой:
    my.ear
    --META-INF
    ----application.xml
    ----jboss-deployment-structure.xml
    --myWeb1.war
    --myWeb2.war
    --myEjb1.jar
    --myEjb2.jar


    Содержимое application.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd">
    <application>
        <display-name>myApp</display-name>
        <initialize-in-order>true</initialize-in-order>
        <module>
            <java>myEjb1.jar</java>
        </module>
    
        <module>
            <java>myEjb2.jar</java>
        </module>
    
        <module>
            <web>
                <web-uri>myWeb1.war</web-uri>
                <context-root>myWeb1</context-root>
            </web>
        </module>
        
        <module>
            <web>
                <web-uri>myWeb2.war</web-uri>
                <context-root>myWeb2</context-root>
            </web>
        </module>
    </application>

    Библиотеки, не содержащие EJB (просто "носители" нужных общих классов), можно поместить в папку my.ear/lib
    Ответ написан
  • Hibernate, OneToMany Каскадной добавление/удаление детей

    @bobzer
    Java EE Developer
    Похоже на то, что ошибка возникает из-за лишних манипуляций с сущностями. Посмотрите под отладкой содержимое сессии, в ней собирается список всех объектов, подлежащих сохранению при вызове flush/commit. Скорее всего, кроме явно видимой в коде сущности user, в сессии в какой-то момент (может, userDAO.findUserItem ?) появляется ещё один экземпляр User, например в UserItemId. Вам надо добиться того, чтобы все взаимосвязи ссылались на один и тот же экземпляр объекта. Для этого попытайтесь выполнять все операции в одной сессии, т.е., если в потоке выполнения кода уже открыта одна сессия, не открывать других сессий (в userDAO.findUserItem ?) пока не будет закрыта текущая сессия.
    Ответ написан
  • Почему все время выдает ошибку при компиляции java приложения?

    @bobzer
    Java EE Developer
    Гугл не смотрели? Поиск по тексту вашей ошибки говорит о том, что, вероятно, Вы сохранили файл .java в папке Program Files (например, в C:\Program Fiels\Java\jdk1.7.0\bin), в которой Windows по умолчанию запрещает создание и модифицирование файлов
    Ответ написан
    Комментировать
  • Какой выбрать Java Web UI framework?

    @bobzer
    Java EE Developer
    GWT - один из лучших вариантов для такой задачи. Если у вас постоянные пользователи, то сгенерированный GWT-скрипт будет грузиться в браузер единожды, и в дальнейшем весь интерфейс будет рисоваться в браузере, без обращений к серверу. Обращения к серверу понадобятся только для получения/передачи чистых данных, без html/xml оберток, и делаться это будет только тогда, когда это действительно требуется вашей логике, т.е., далеко не каждое действие пользователя будет вызывать обращение к серверу. К тому же, можно кешировать часто используемые данные на клиенте, снижая трафик и нагрузку на сервер. Еще один плюс - очень много логики (например, сложный форматно-логический контроль) можно выполнять на клиенте, без обращений к серверу.

    Насчет дизайна: в GWT есть минимальный набор компонентов, с помощью которого можно "нарисовать" динамический интерфейс любой сложности. Если ваша цель - не завлечь на сайт пользователей красивыми/необычными рюшечками, а создать функциональное рабочее место, то базовых компонентов должно хватить.

    Кстати, тот же Vaadin работает на GWT. Он дополняет его своими компонентами, но убивает на корню один из главных плюсов GWT - высокую степень независимости от сервера во время действий пользователя.

    Насчет нагрузки: 1000 человек, постоянно работающих в приложении, это много. Готовьте мощные сервера под СУБД и под сервер приложений, плюс держите в уме возможность развертывания кластера для распределения нагрузки.

    Если Вы - Java-программист, то разрабатывать под GWT будет приятно, а точнее - как обычно. Например, процесс разработки под JSF - то ещё "удовольствие", GWT в этом плане гораздо лучше.
    Ответ написан
    Комментировать
  • Как декомпилировать и потом опять скомпилировать jar'ку сделав некоторые изминения?

    @bobzer
    Java EE Developer
    В среде разработки подключите в качестве библиотеки jar-источник декомпилированного класса
    Ответ написан
    Комментировать
  • Как защититься от сис.админа и программиста, храня секретные данные в БД?

    @bobzer
    Java EE Developer
    Не совсем ответ на Ваш вопрос, но всё же. Называть сведения о ЗП "высокосекретными", мягко говоря, неверно. Они не секретны, а конфиденциальны, и обычно защищаются пунктами трудового договора. Мне кажется, что у вас сейчас проблема в том, что поставлена задача, оторванная от реальности. Вы пытаетесь потратить уйму времени на разработку, породив при этом кучу проблем в последующей поддержке - на фикцию. Даже при успешной реализации, подумайте, что улучшится на предприятии? Сотрудники перестанут общаться между собой (в т.ч. тихонько интересуясь кто сколько "получает")? Компания при публикации резюме перестанет указывать вилку ЗП? Я бы порекомендовал серьезно задуматься над постановкой задачи, очень похоже на стрельбу из пушки по воробьям...
    Ответ написан
    1 комментарий
  • Как реализовать PRC client-server?

    @bobzer
    Java EE Developer
    Наверное, проблема в том, что Вам в первую очередь надо понять, что подразумевается под "сервером". Обычно, имеется в виду Сервер приложений (СП), но даже самые "навороченные" сервера приложений сами по себе не могут ответить вашему клиенту даже на простейший "Привет". Ответить может серверная часть вашего приложения, развернутая под управлением СП. Т.е., сначала выбираете СП, затем читаете Гугл по поводу того, как развернуть на нем простейшее приложение с вашей логикой, и только затем выбираете какой-либо из вариантов реализации RPC и разбираетесь как развернуть его в вашей серверной логике. Разные реализации RPC могут быть доступны в СП по разным портам. На мой взгляд, более распространенными и более универсальными считаются протоколы, работающие "поверх" HTTP, в свою очередь среди них, наиболее универсальны и распространены веб-сервисы.

    Таким образом:
    1. Просто написать клиента не получится, задача комплексная и для новичка может быть непростой.
    2. Выберите СП (для Java, обычно, Tomcat или JBoss) и погуглите как развернуть веб-сервис под его управлением.

    Когда заработает, будут первичные понятия о механизмах, и готовое серверное приложение. Имея это, можно будет вернуться к исходной задаче и уже более осмысленно решить, какой именно протокол наиболее подходит под Ваши нужды.
    Ответ написан
    Комментировать
  • Как развернуть Tomcat на сервере?

    @bobzer
    Java EE Developer
    Абсолютное большинство услуг хостинга подразумевают возможность развертывания приложений, написанных на PHP, причем без доступа к веб-серверу. Это связано с тем, что они сами разворачивают веб-сервер, который обслуживает одновременно множество аккаунтов пользователей (т.е., много сайтов, принадлежащих разным владельцам, разворачиваются на одном веб-сервере). Если у вас приложение на PHP, то, скорее всего, Вам на самом деле не нужен Tomcat, можно обойтись стандартным PHP-хостингом.

    Но, раз уж Вы написали вопрос в разделе Java, видимо требуется развернуть приложение на Java. Услуг хостинга таких приложений очень мало, в большинстве случаев приходится арендовать виртуальный (или даже "железный") сервер, и на нем разворачивать самостоятельно любую инфраструктуру. Но можно найти и альтернативы. В конце прошлого года компания Infobox анонсировала новый облачный хостинг с поддержкой Java, причем Tomcat у них уже преднастроенный, добавляется в пару кликов. У меня как раз Java-проект готовился к запуску, и я решил попробовать. Пошел второй месяц: полет нормальный, денег потрачено менее 300 рублей (правда и нагрузки большой пока не было). У них есть свой хаб на Хабре, найдите его среди компаний, почитайте - они в последнее время только про этот хостинг и пишут.
    Ответ написан
    4 комментария
  • Hibernate, ilike, русские буквы?

    @bobzer
    Java EE Developer
    Я бы посоветовал для начала погонять все запросы без Hibernate, а напрямую в БД и посмотреть на результаты. Либо почитать доку/погуглить насчет того, как работает ваша СУБД с регистром символов. Например, Oracle обязует указывать в условии тот же регистр, что и в БД (иначе не найдёт), а MySQL позволяет об этом не задумываться. Надежнее всего перед сохранением данных в БД приводить регистры символов в некое предопределенное состояние (например все символы в верхний регистр), а впоследствии при наложении условия на выборку также приводить регистр искомой строки. Если в базе уже мусор (кто как ввел, так и сохранилось) то можно создать индексы в нужном регистре, т.е. в поле таблицы как попало, а в индексе по этому полю всё в UPPER. Либо сделать update table set field = UPPER(field). В общем сначала смотрите в СУБД, а уже потом в Hibernate...
    Ответ написан
    Комментировать
  • Как правильно организовать клиент-серверное общение?

    @bobzer
    Java EE Developer
    Видимо, универсальный метод общения в гетерогенной среде - HTTP/XML: и Java и Objective C умеют с ним работать. Например, вот тут на stackoverflow есть пара слов теории. На мой взгляд, основным минусом является то, что на каждое действие надо будет разработать метод серверной части и сделать его доступным посредством HTTP. Этого недостатка нет у различных фреймворков, которые стараются упростить написание клиентов, например JSF в Java, но тут встает вопрос о кроссплатформенности - как бы не пришлось плодить отдельную разработку под каждого программного клиента.
    Ответ написан
    Комментировать
  • Какую почитать книгу для начинающих по Java сервлетам JSP?

    @bobzer
    Java EE Developer
    JSP - вещь полезная при изучении, дающая базовое понимание того, как формируются "тонкие" интерфейсы на стороне сервера. Но советую в JSP сильно не углубляться, т.к. технология устаревшая - на ее замену пришел JSF. Вообще, насчет стека технологий для изучения - почитайте ответы на похожий вопрос: С чего начать изучение Java EE
    Ответ написан
    1 комментарий
  • Взаимодействие между двумя EJB-модулями внутри одного приложения?

    @bobzer
    Java EE Developer
    Вы не показали, как создается SomeBean. Я это к тому, что контейнер делает инъекцию в бины, которые сам создает. Если вы SomeBean создали через new, то никаких инъекций в него не будет.

    Также можно покопать в сторону загрузки классов, которая в свежем JBoss-е существенно переработана, в сравнении с предыдущими версиями. Попробуйте, например в jboss-deployment-structure.xml указать <ear-subdeployments-isolated>false</ear-subdeployments-isolated>. В конце-концов, объедините core.jar и app.jar в один jar (тупо средствами WinRar-а, если долго переделывать скрипты сборки) и посмотрите, будет ли инъекция. Если будет — то 99% что надо ковырять загрузку классов. Если нет, то это скорее всего ни при чем, и надо думать дальше.
    Ответ написан
    Комментировать