Страницы

Поиск по вопросам

Показаны сообщения с ярлыком java-ee. Показать все сообщения
Показаны сообщения с ярлыком java-ee. Показать все сообщения

понедельник, 13 апреля 2020 г.

Подскажите книги по java ee [дубликат]

#java #java_ee #jsp #книги

                            
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            Книги и учебные ресурсы по Java
                                
                                    (1 ответ)
                                
                        
                Закрыт 4 года назад.
            
        

Желательно на русском    


Ответы

Ответ 1



Все книги на русском, с направлением веб разработки: "Blinov Java Industr Programming" "Дэвид Гери, Кей Хорстманн - JavaServer Faces. 3-е издание" "Ильдар Хабибуллин - Разработка web-служб средствами Java" - исключительно для изучения веб служб, таких как WSDL UPD Дэвид Хеффельфингер: Java EE 6 и сервер приложений GlassFish

Ответ 2



На английском книг по J2EE раз 2 и обчелся, а вы на русском просите. Рекомендую Beginning Java EE 6 with GlassFish 3. Читайте с переводчиком, переводите незнакомые слова, английский пригодится.

четверг, 9 апреля 2020 г.

Как из фильтра передать управление сервлету?

#java #java_ee #servlet

                    
Есть сервлет myServlet и фильтр MyFilter, который перехватывает обращение к сервлету.
После фильтра, как я понял, должен сначала отработать сервлет, после чего он передаёт
уже управление в jsp, но не понимаю как ему
передать управление?

У меня получается только из фильтра сразу выдать jsp, если я перенаправляю запрос так:

request.getRequestDispatcher("myJsp.jsp").forward(request , response);


В сервлете надо сделать пару важных вычислений.
    


Ответы

Ответ 1



После того как в фильтре выполнили все необходимые действия просто передавайте управление далее по цепочке: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Выполняем действия... // Передаем управление далее chain.doFilter(request, response); } Последним элементом в цепочке и будет сервлет.

вторник, 17 марта 2020 г.

Как найти open source проект под себя [закрыт]

#java_ee #java #opensource


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Здравствуйте, помогите, пожалуйста, найти не большой и не слишком сложный open source
проект на java. Я хочу получить опыт, перед тем как устраиватся на джуниора, и считаю,
что open source лучшее решение. Но, к сожалению, никак не могу найти проект, который
мне бы подошел. Желательно, чтобы там был спринг и мавен. Извините за столь глупый
вопрос)    


Ответы

Ответ 1



Пробовали искать на GitHub? Что-нибудь вроде вот этого.

Ответ 2



Можете попробовать на JavaTalks стукнуться. Там пишут форум. Со спрингом и мавеном, как вы хотите )

воскресенье, 15 марта 2020 г.

Определить, какие ключевые слова языка Java содержит файл

#java #строки #java_ee #arraylist


Нагуглил только contains, но он почему-то не работает.. видимо делаю что-то не так

keyWords - ArrayList


sortingList тоже, я так понимаю нужно каким-то образом сравнить все слова в файле
со списком моих слов, а как чет не доходит

for (int i = 0; i < 50; i++) {
    if (sortingList.get(index).contains(keyWords.get(i))) {
        counter++;              
    }
}


Ответ ниже помог, но теперь проблема с повторяющимися словами. они не учитываются

for (String st : keyWords) {
                for (String g : sortingList) {
                    if (st.contains(g) && g.length() > 1) {

                        sortedList.add(g);
                        counter++;
                    }
                }
            }

    


Ответы

Ответ 1



Если честно я не совсем понял вопроса. Вы хотите в увеличивать counter за каждое совпадение слов? Если да, то лучше воспользоваться циклом for-each и сделать вот так. for (String s : keyWords) { for (String g : sortingList) { if (s.contains(g)) { counter++; } } }

четверг, 5 марта 2020 г.

Entity (сущности) — зачем они нужны?

#java #ооп #java_ee #entity


Всем добрый вечер.

В ходе одного обучающего проекта наткнулся на необходимость использовать Entity (сущность).
В данном случае, существует 3 класса, наследуемые друг от друга:

Entity.java:

public class BaseEntity {
    protected Integer id;

    public BaseEntity() {
    }

    protected BaseEntity(Integer id) {
        this.id = id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public boolean isNew() {
        return (this.id == null);
    }

    @Override
    public String toString() {
        return String.format("Entity %s (%s)", getClass().getName(), getId());
    }
}


От него наследуется NamedEntity:

public class NamedEntity extends BaseEntity {

    protected String name;

    public NamedEntity() {
    }

    protected NamedEntity(Integer id, String name) {
        super(id);
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    @Override
    public String toString() {
        return String.format("Entity %s (%s, '%s')", getClass().getName(), id, name);
    }
}


А от него — User:

import java.util.Date;
import java.util.EnumSet;
import java.util.Set;

import static MealsUtil.DEFAULT_CALORIES_PER_DAY;

public class User extends NamedEntity {

    private String email;

    private String password;

    private boolean enabled = true;

    private Date registered = new Date();

    private Set roles;

    private int caloriesPerDay = DEFAULT_CALORIES_PER_DAY;

    public User() {
    }

    public User(Integer id, String name, String email, String password, Role role,
Role... roles) {
        this(id, name, email, password, DEFAULT_CALORIES_PER_DAY, true, EnumSet.of(role,
roles));
    }

    public User(Integer id, String name, String email, String password, int caloriesPerDay,
boolean enabled, Set roles) {
        super(id, name);
        this.email = email;
        this.password = password;
        this.caloriesPerDay = caloriesPerDay;
        this.enabled = enabled;
        this.roles = roles;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRegistered() {
        return registered;
    }

    public void setRegistered(Date registered) {
        this.registered = registered;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public int getCaloriesPerDay() {
        return caloriesPerDay;
    }

    public void setCaloriesPerDay(int caloriesPerDay) {
        this.caloriesPerDay = caloriesPerDay;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public Set getRoles() {
        return roles;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User (" +
                "id=" + id +
                ", email=" + email +
                ", name=" + name +
                ", enabled=" + enabled +
                ", roles=" + roles +
                ", caloriesPerDay=" + caloriesPerDay +
                ')';
    }
}


Я не совсем понимаю смысл такой "матрёшки". Внятного объяснения на русском не обнаружил.
Прошу поделиться смыслом сущностей, особенно меня интересует, почему мы пишем отдельно
id, отдельно name, отдельно всё остальное. Объяснение нужно прямо для чайников, а именно,
почему мы не можем без них обойтись или почему лучше их использовать. Также, подойдут
русскоязычные ресурсы, на которых разжёвывают, почему мы должны пользоваться сущностями
и вообще для чего они.
    


Ответы

Ответ 1



Решить каким образом использовать сущности и использовать ли их вообще поможет понимание следующей модели представления даннных. Когда мы говорим о сущностях в абстрактном смысле мы всегда в том или ином виде подразумеваем использование какой-либо модели данных. В частности, в программировании применяется EER-модель (Enhanced Entity-Relationship model). Расширенная модель включает все концепции ER-модели (entity-relationship model) и дополнительно включает понятия подкласса, суперкласса и относящиеся к ним понятия специализации, обобщения и категоризации. Далее рассмотрим базовую ER-модель. "Набор данных, обычно относящихся к какой-либо предметной области или тематической области, и структурированных таким образом, чтобы обеспечить установление отношений между отдельными элементами данных в соответствии с различными потребностями пользователей." G. Knott & N. Waites, Computing 3rd edition ER-модель, модель «сущность — связь» Модель была предложена в в 70-х годах Питером Пин-Шэн Ченом (сайт, статья). Модель "сущность-связь" основывается на некой важной семантической информации о реальном мире и предназначена для логического представления данных. Она определяет значения данных в контексте их взаимосвязи с другими данными. Важным для нас является тот факт, что из модели "сущность-связь" могут быть порождены все существующие модели данных (иерархическая, сетевая, реляционная, объектная), поэтому она является наиболее общей. Сущность фактически представляет из себя множество атрибутов, которые описывают свойства всех членов данного набора сущностей. Например, как у вас в коде. Есть базовая сущность BaseEntity, именованная сущность NamedEntity и конкретная User(пользователь). Таким образом сущность - это объект, который может быть идентифицирован неким способом, отличающим его от других объектов. Преимущества использования ER-модели Высокая гибкость. Обеспечивают: модульность, что позволяет переиспользовать код следуя принципу DRY; простоту рефакторинга Местная автономия. В каждой отдельной части программы можно работать только с нужными нам сущностями. Простота понимания. За счет семантического моделирования данных, при котором отдельная сущность опирается на смысл этих данных. Любую модель легко изобразить в виде диаграммы. Наличие и простота визуализации. Нотация П. Чена, Crow’s Foot, UML, DFD, IDEF0 и IDEF1x, нотация Мартина, нотация Бахмана и др. Недостатки использования ER-модели Сложность. Модель предназначена для высокого уровня абстракции. Увеличивается объем и сложность кодирования. Вам пришлось создать 3 класса со своими полями и методами, хотя можно было бы их оформить в одном классе. Кроме того разработчикам достаточно сложно хранить всю иерархию классов в голове. Безопасность. Трудно контролировать уровни доступности атрибутов сущности. Трудно поддерживать целостность. Такая модель чувствительна к изменению атрбутов.

среда, 4 марта 2020 г.

AdMob Реклама не работает корректно

#java #android #android_studio #java_ee


LogcatEvent LogДобавляя тестовый ad unit ID(с офиц. сайта AdMob for Androids)(ca-app-pub-3940256099942544/6300978111),
всё работает отлично, и тип эта реклама поздравляет меня, что я смог её разместить.
Но стоит мне поставить мой ad unit ID(моего приложения), ничего не появляется...
Вот собственно файлы и их коды:

activity_main.xml:




    

    


Ответы

Ответ 1



Вы используете не то значение при инициализации AdMob. А именно - у вас в строке MobileAds.initialize(this, "ca-app-pub-8900900048721624/5809873614"); используется, видимо, ID баннера, а не ID приложения. Это 2 разных значения. Проверьте в настройках приложения в AdMob какое значение вам надо подставить при инициализации. Также захардкоженные размеры баннера не ОК. Лучше поставить ширину во весь экран и высоту по содержимому. Ну и выкладывать в общий доступ эти ID - плохая идея. Кто-то может их заюзать, накликать очень много с одного девайса и ваш акк заблокируют навсегда за накрутку и вы ничего не сможете доказать.

вторник, 25 февраля 2020 г.

План изучения Java для Web [закрыт]

#java #java_ee


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Посоветуйте план изучения java для веб, собственно, java ee. Что почитать, что необходимо
знать. Понимаю, что вопрос уже задавался не один раз, но хотелось бы услышать актуальное
мнение.
Немного о себе: изучал java по первому тому хорстманна, писал небольшие приложения
в университете (лабораторные, курсовые работы), html, xml.
Что советуете прочитать/узнать, чтобы получить более менее полное представление о
веб разработке на java.
Язык предпочтительно русский, но английский не будет большой проблемой    


Ответы

Ответ 1



Последовательность изучения: Servlets (установить себе в конце-то концов Tomcat) JSP (обратить внимание на теги и простейшие фреймворки типа Struts) JDBC (перед изучением знать хотя бы что-то о SQL и не ограничиваться одним JDBC-ODBC бриджем) Hibernate (попробовать пару-тройку диалектов, скажем MySQL/MS SQL Server/Oracle) Spring По JSP/Servlet есть уже классическая книга: М.Холл: Сервлеты и Java Server Pages По Hibernate и Spring сложно - не знаю ничего приличного.

Ответ 2



Советую найти любую книжку по Java EE и сделать акцент на самые простые вещи, например; как сделать так что б дата которая посылается от клиента заходила в БД, как вытягивать из базы данных информацию - и где и как ее отображать. А еще, если вы уже делали некие лабораторные работы то можете прямиком их же и реализовать для постройки веб-сайта, скорее всего он будет мини сайт но зато вы будете опираться на то что уже знаете .

Пример java ee

#java_ee #java #база_данных #spring


Добрый день. Сейчас изучаю стек java технологий связанных с веб разработкой. Ищу
пример проекта с использованием Spring, работой с БД, JSP и прочее сопутствующее с
целью поразбираться в более-мение реальном коде. Подойдет например какой нибудь сайт
с регистрацией, и данными привязанными к аккаунту с JSP фронтом.    


Ответы

Ответ 1



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

Ответ 2



Вряд ли кто даст рабочий проект, но я рекомендую сделать поиск на Github: "Spring Hibernate". По этому поиску выдает много чего. Вот например этот

пятница, 14 февраля 2020 г.

Ошибка чтения/записи при работе с файлом(Java EE)

#java #файлы #java_ee


Добрый день, возникла очень не понятная ошибка... Дело в том, что у меня некоторые
данные хранятся в файле, при развертывании TomCat происходит удачное считывание с файлов.
Но также у меня есть админка - там у пользователя есть возможно изменить данные в файле,
после перезаписывании данных вылетает исключение(NullPointerException) видите ли такого
файла не существует, хотя он находится там я проверял... Вообще не понятная ситуацию,
вот методы для записи и чтение данных из файла:

Считывание

public synchronized String readFile(String filePath){
    StringBuffer txt = new StringBuffer();
    List lines = null;
    try {
        lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8);
    } catch (IOException e) {
        log.error("Error reading from: " + filePath);
    } catch (NullPointerException e){
        log.error("Incorrect path : " + filePath);
    }
    for(String line: lines){
        txt.append(line);
    }
    return txt.toString();
}


Запись

public synchronized void writeFile(String filePath, String data){
    try {
        FileWriter out = new FileWriter(filePath, false);
        out.write(data);
        out.close();
    } catch (IOException e) {
        log.error("Error writing to file: " + filePath);
    }
}


Надеюсь, что кто-нибудь подскажет какая причина этого, потому что сам уже 2-ой день
бьюсь с этим. Вот собственно ошибки, которые мне выдаются:

Type Exception Report
Message An exception occurred processing JSP page [/admin_room.jsp] at line [39]
Description The server encountered an unexpected condition that prevented it from
fulfilling the request.

Exception org.apache.jasper.JasperException: An exception occurred processing JSP
page [/admin_room.jsp] at line [39] 

36:                 
37:
38: 39: "> 40:
41:
42: Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ru.tidstu.testingsystem.servlets.DispatcherServlet.forward(DispatcherServlet.java:22) ru.tidstu.testingsystem.servlets.admin_room.CommonDataServlet.doPost(CommonDataServlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) Root Cause java.lang.NullPointerException ru.tidstu.testingsystem.models.IOFile.readFile(IOFile.java:33) ru.tidstu.testingsystem.models.FactoryModels.getCommonData(FactoryModels.java:107) org.apache.jsp.admin_005froom_jsp._jspService(admin_005froom_jsp.java:152) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ru.tidstu.testingsystem.servlets.DispatcherServlet.forward(DispatcherServlet.java:22) ru.tidstu.testingsystem.servlets.admin_room.CommonDataServlet.doPost(CommonDataServlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


Ответы

Ответ 1



У вас имеется следующий код, где вы ловите исключения в случае, если что-то пошло не так при чтении файла: try { lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); } catch (IOException e) { log.error("Error reading from: " + filePath); } catch (NullPointerException e){ log.error("Incorrect path : " + filePath); } Однако после обработки этих исключений переменная lines остаётся со значением null - и при последующей попытке обхода мы получаем NullPointerException: for(String line: lines){ txt.append(line); } Скорее всего, данный обход списка тоже нужно перенести внутрь блока try-catch. P.S.: И при обработке IOException желательно сохранить исходное сообщение - по нему будет проще понять, что пошло не так: catch (IOException e) { log.error(String.format("Error reading from file '%s': %s", filePath, e.getMessage())); } P.P.S.: Кстати, можно упростить метод чтения: public synchronized String readFile(String filePath){ try { return Files .lines(Paths.get(filePath), StandardCharsets.UTF_8) .collect(Collectors.joining()); } catch (IOException e) { ... } }

Ответ 2



Я бы проще сделал так: public synchronized String readFile(String filePath){ StringBuffer txt = new StringBuffer(); try { List lines = null; lines = Files.readAllLines(Paths.get(filePath.toString()), StandardCharsets.UTF_8); for(String line: lines){ txt.append(line); } } catch (IOException | NullPointerException e) { log.error("Error reading from file: " + filePath); } return txt.toString(); } т.е. все в один блок try, кроме txt. В случае ошибки, метод вернет пустую строку и отпишет об этом в лог (наверное, предполагалось именно это).

четверг, 13 февраля 2020 г.

Hibernate - ошибка при создании таблицы

#java #spring #hibernate #java_ee


У меня есть модель User

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

// Пошаманить з User и настройками hibernate
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    private long id;

    @Column(nullable = false, length = 20)
    private String nickname;

    @Column(nullable = false, length = 20)
    private String password;

    @Column(length = 2)
    private String country;

    public User() {}

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}


Создан контролер, репозиторий, но почему-то вылетает ошибка:

[2016-05-27 10:08:59,668] Artifact MessengerServer:war: Artifact is being deployed,
please wait...
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
27-May-2016 10:09:02.569 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.jpa.internal.util.LogHelper.logPersistenceUnitInformation
HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
27-May-2016 10:09:02.671 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.Version.logVersion
HHH000412: Hibernate Core {5.1.0.Final}
27-May-2016 10:09:02.674 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.cfg.Environment.
HHH000205: Loaded properties from resource hibernate.properties: {hibernate.show_sql=true,
hibernate.bytecode.use_reflection_optimizer=false, hibernate.hbm2ddl.auto=create, hibernate.dialet=org.hibernate.dialect.PostgreSQL9Dialect}
27-May-2016 10:09:02.674 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.cfg.Environment.buildBytecodeProvider
HHH000021: Bytecode provider name : javassist
27-May-2016 10:09:02.732 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.annotations.common.reflection.java.JavaReflectionManager.
HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
27-May-2016 10:09:03.206 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.dialect.Dialect.
HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL94Dialect
27-May-2016 10:09:03.366 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl.useContextualLobCreation
HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
27-May-2016 10:09:03.368 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.type.BasicTypeRegistry.register
HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@48909093
Hibernate: drop table if exists room cascade
Hibernate: drop table if exists user cascade
27-May-2016 10:09:04.181 WARN [RMI TCP Connection(29)-127.0.0.1] org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl.handleException
GenerationTarget encountered exception accepting command : Unable to execute command
[drop table if exists user cascade]
 org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute command
[drop table if exists user cascade]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:63)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:370)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlStrings(SchemaDropperImpl.java:355)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:240)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:153)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:125)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:111)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:137)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:64)
    at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:458)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:881)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4809)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1696)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:484)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:433)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
    at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
Hibernate: create table room (id int8 not null, author varchar(255) not null, title
varchar(30) not null, primary key (id))
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.postgresql.util.PSQLException: ОШИБКА: ошибка синтаксиса (примерное
положение: "user")
  Позиция: 22
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:366)
    at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
    at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:51)
    ... 72 more

Hibernate: create table user (id int8 not null, country varchar(2), nickname varchar(20)
not null, password varchar(20) not null, primary key (id))
27-May-2016 10:09:04.241 WARN [RMI TCP Connection(29)-127.0.0.1] org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl.handleException
GenerationTarget encountered exception accepting command : Unable to execute command
[create table user (id int8 not null, country varchar(2), nickname varchar(20) not
null, password varchar(20) not null, primary key (id))]
 org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute command
[create table user (id int8 not null, country varchar(2), nickname varchar(20) not
null, password varchar(20) not null, primary key (id))]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:63)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:423)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:408)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:310)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:165)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:134)
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:120)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:148)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:64)
    at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:458)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:881)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4809)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1696)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:484)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:433)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
    at sun.reflect.GeneratedMethodAccessor80.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.postgresql.util.PSQLException: ОШИБКА: ошибка синтаксиса (примерное
положение: "user")
  Позиция: 14
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:366)
    at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
    at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:51)
    ... 72 more

27-May-2016 10:09:04.247 INFO [RMI TCP Connection(29)-127.0.0.1] org.hibernate.tool.schema.internal.SchemaCreatorImpl.applyImportSources
HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@2850dd14'
[2016-05-27 10:09:05,739] Artifact MessengerServer:war: Artifact is deployed successfully
[2016-05-27 10:09:05,739] Artifact MessengerServer:war: Deploy took 6 071 milliseconds


У меня есть 1 таблица, и все работало, пока не создал вторую (не знаю, почему. Прилягаю
hibernate.properties :

hibernate.dialet = org.hibernate.dialect.PostgreSQL9Dialect
hibernate.show_sql = true

hibernate.hbm2ddl.auto = create


И db.properties : 

db.driver = org.postgresql.Driver
db.url = jdbc:postgresql://localhost:5432/messengerdb
db.username = postgres
db.password = root
db.entity.package = ua.samuliak.messenger.entity

db.initialSize = 30
db.minIdle = 30
db.maxIdle = 60
db.timeBetweenEvictionRunsMillis = 30000
db.minEvictableIdleTimeMillis = 60000
db.testOnBorrow = true
db.validationQuery = select version()


Spring я только начал изучать. Пока что не могу понять, как исправить ошибку.



UPDATE: Проблема решена! Не хотело создавать табличку с именем "user", заменил на
"client" и все хорошо. Но не понимаю, почему так 
    


Ответы

Ответ 1



user - зарезервированное слово в SQL. Его нужно экранировать: @Table(name="\"user\"")

воскресенье, 2 февраля 2020 г.

Аннотация в Java EE

#java #java_ee #аннотации


Всем привет. Хотел узнать у знающих, что такое аннотации, и зачем они нужны. 
До того как начал изучать Java EE у меня было представление, что я знаю, что это
такое. Но как дошел до Java EE, увидел, что они применяются везде особенно в JAX-RS
и при написании веб сервисов. 

Зашел в документацию прочитать про @Context и посмотреть что там внутри. Вот то,
что увидел, если кто сможет объяснить синтаксис и саму логику данного кода буду признателен.
Если есть ссылки на объяснение буду рад почитать.   

 @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Context {
 }

    


Ответы

Ответ 1



Это просто объявление аннотации без какой-либо логики. Как объявить аннотацию, рассказывается в любом учебнике по Java. По-порядку: @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD}) Аннотация @Target, объявляет элементы исходного кода, к которым можно применить создаваемую аннотацию. В данном случае это: параметры методов (ElementType.PARAMETER), сами методы (ElementType.METHOD) и поля классов (ElementType.FIELD). @Retention(RetentionPolicy.RUNTIME) Аннотация @Retention, говорит компилятору, как долго нужно хранить аннотацию в коде. Политика RetentionPolicy.RUNTIME заставляет компилятор сохранить аннотации в .class-файлах и делает их доступными во время выполнения программы через рефлексию. @Documented Аннотация @Documented включает создаваемую аннотацию в список элементов исходного кода, для которых генерируется документация (при использовании инструментов генерации документации). public @interface Context { } Это, собственно, непосредственно объявление новой аннотации @Context. Сами по себе аннотации - просто маркеры, никакой работы они не выполняют. Что касается логики ("магии") аннотаций то обычно это работает так: есть какой-то класс, отвечающий за инициализацию, он пробегает при помощи рефлексии по классам в определенном пакете и ищет какую-то аннотацию. Если находит - экземпляры этого класса подвергаются какой-либо обработке, например полям классов задаются некоторые значения. В случае с JAX-RS "магией" занимается поставщик реализации (напр. CXF, Jersey, RESTEasy). Где-то в его недрах есть класс, который анализирует аннотации, которыми вы украсили ваши ресурсы и выполняет действия в соответствии со спецификацией JAX-RS. Например, составляет карту соответствий URL-ов конкретным методам, на основе аннотаций @Path и @GET/@PUT/@POST/@DELETE.

Ответ 2



Пример на основе этой статьи: 1) Создаем новый класс-аннотацию: @Target(value= ElementType.TYPE) @Retention(value= RetentionPolicy.RUNTIME) public @interface ControlledObject { String name(); } 2) Используем эту аннотацию, т.е. аннотируем класс: @ControlledObject(name="biscuits") public class Cookies { ... } 3) Как работает аннотация: где-то в коде мы проверяем, аннотирован ли наш класс Cookies этой аннотацией, ControlledObject. Если да, то выполняются одни действия, если нет - другие: Class cl = Class.forName("Cookies"); if(!cl.isAnnotationPresent(ControlledObject.class)){ ... } else { ... }

пятница, 24 января 2020 г.

Как вывести ошибку на стороне клиента в случае неуспешной операции удаления?

#java #mysql #java_ee


Стоит задача по разработке админ панели для интернет-магазина запчастей. Есть таблица
товаров и заказов в MySQL, администратор может удалить товар только в том случае, если
id товара не используется в базе заказов.

Это все понятно. Удаление сделал, теперь хочу красиво вывести ошибку, если товар
есть в заказе, а я его случайно хотел удалить. В сервисном слое try/catch отлавливаю
и вывожу надпись ошибки. 
Но хотелось бы реализовать редирект на страничку товаров и вывести ошибку в клиенте. 

Не совсем понимаю как это действие реализовать. 
Подскажите пожалуйста. Буду благодарен очень.

Код контроллера по удалению:

public class DeleteOrdController implements Controller {
    private OrdService ordService = OrdServiceIpl.getInstance();
    private Logger logger = Logger.getLogger(DeleteOrdController.class);

    @Override
    public void execute(HttpServletRequest req, HttpServletResponse resp) {
        try{
            String id = req.getParameter("deleteOrd");
            long ordId = Long.parseLong(id);
            ordService.delete(ordId);
            String contextPath = req.getContextPath();
            resp.sendRedirect(contextPath + "/frontController?command=orders");
        } catch (IOException e) {
            logger.error(e);
        }

    }
}


Таблица товаров:

 
            
Parts id Producer Category Name parts Chatacteristics Price Delete
${status.index + 1} ${batteries.id} ${batteries.producer} ${batteries.category} ${batteries.name} ${batteries.chatacteristics} ${batteries.price}

Сервисный слой: @Override public int delete(Serializable id) { try { return partsDao.delete(id); } catch (SQLException e) { throw new ServiceException("Ошибка удаления Parts по id " + id); } } ДАО @Override public int delete(Serializable id) throws SQLException { psDelete.setLong(1, (long) id); return psDelete.executeUpdate(); }


Ответы

Ответ 1



т.е. перед удалением товара (parts) нужно проверить его наличие в таблице (orders) и если он там имеется, то вывести предупреждение... Другой вариант, в таблице товаров завести колонку в скольких заказах товар участвует... и например (тут уж от вашей бизнес-логики зависит) каждый новый заказ увеличивает это число на 1, каждый выполненный заказ уменьшает. Если значение больше 0, то удалить товар нельзя. т.е. и в ДАО и в Сервисе нужны еще специальные методы отвечающие за проверку Соответсвенно, контроллер получив информацию, о том, что такой товар имеется в заказах, отправляет указание странице вывода, а там под специальным тегом сообщение об ошибке

среда, 22 января 2020 г.

Как увидеть разницу между stateless и stateful session-бинами в EJB?

#java #java_ee


По идее, stateless бин не должен сохранять своё состояние (значения своих полей)
после завершения запроса. Например, вызов метода GetSum(13) каждый раз должен возвращать
"13".
import javax.ejb.*;  
import javax.jws.*;

@Stateless  
@WebService(endpointInterface = "ITestWebService")   
public class TestWebService implements ITestWebService  
{  
    private double sum = 0.0;

    @Override 
    public double GetSum( double a )
    {
        this.sum += a;
        return sum;
    }
}

Но повторный вызов возвращает 13, 26, 39, ... Я неправильно понимаю stateless или
можно грешить на сервер приложений?    


Ответы

Ответ 1



Stateless означает, что бин не держит состояние между сессиями. То есть надо "убить" бин чтобы увидеть что он не сохраняет свое внутреннее состояние.

Ответ 2



У Stateful бина есть события @PrePassivate и @PostActivate для сериализации. Т.е. при нехватке ОЗУ этот бин может сохраняться на жесткий диск.

суббота, 11 января 2020 г.

Glassfish NullPointeException сервер не запускается

#java #intellij_idea #java_ee #glassfish


Только скачал архив GlassFish 5.0 - Full Platform, разархивировал его, запускаю через
командную строку 


  asadmin start-domain


и выбивает

`Exception in thread "main" java.lang.NullPointerException
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.initializeServiceLocator(AbstractModulesRegistryImpl.java:152)
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.newServiceLocator(AbstractModulesRegistryImpl.java:144)
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.createServiceLocator(AbstractModulesRegistryImpl.java:218)
    at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.createServiceLocator(AbstractModulesRegistryImpl.java:224)
    at com.sun.enterprise.module.single.StaticModulesRegistry.createServiceLocator(StaticModulesRegistry.java:88)
    at com.sun.enterprise.admin.cli.CLIContainer.getServiceLocator(CLIContainer.java:217)
    at com.sun.enterprise.admin.cli.CLIContainer.getLocalCommand(CLIContainer.java:255)
    at com.sun.enterprise.admin.cli.CLICommand.getCommand(CLICommand.java:231)
    at com.sun.enterprise.admin.cli.AdminMain.executeCommand(AdminMain.java:371)
    at com.sun.enterprise.admin.cli.AdminMain.doMain(AdminMain.java:306)
    at org.glassfish.admin.cli.AsadminMain.main(AsadminMain.java:57)`


Пробовал в файле asenv.bat установить путь set path=C:/.../Java/bin - не помогло.
Пробовал так запустить: asadmin start-domain domain1 - не помогло.

Установлена: jdk-9.0.1
Также пробовал на 8-ой, не помогло. Что делать???
    


Ответы

Ответ 1



Решение оказалось банальным до ужаса, облазив просторы интернета я обнаружил, что jdk-9.0.1 тупо не поддерживается (пока что) GlassFish 5.0 - Full Platform. Я установил обратно 8-мую Java и начал тестить. Ошибка оставалась. Пути в системных переменных я поменял с 9 на 8. Но ошибка не уходила. И тут я решил проверить, а какая версия Java вызывается с коммандной строки. Как оказалось, даже если в переменной Path установлен путь к 8, оно по какой-то причине все равно вызывает 9-ю Java. Перезагрузка не помогла. Решение - полное удаление 9 джавы. P.S. иногда выскакивала ошибка: your jdk is version 0 Это опять таки из-за несовместимости.

пятница, 10 января 2020 г.

Понятие контекста в веб приложении

#java #java_ee


Хотел узнать что такое контекст?


Контекст сервлета 
Контекст запроса 


Из прочитанного мною в сети не могу понять что подразумевается под понятием контекста?
 Если кто-то сможет дать линк на инфу с объяснением что такое контекст для веб приложения
или дать хороший пример, я буду рад.
    


Ответы

Ответ 1



Понятие контекста, в широком смысле, обычно означает окружение объекта. Например, если есть некий объект, то в процессе работы приложения он будет взаимодействовать с другими объектами, иметь доступ к параметрам конфигурации, переменным, зависеть от состояния других объектов или существовать в рамках жизненного цикла. Глобальные и локальные переменные, переменные окружения, взаимодействующие с данным объекты, их состояние и т.д и т.п - все вместе образует контекст объекта - то окружение с которым он работает. Т.е. контекст - это execution / runtime окружение объекта в целом. ServletContext - это объект, который содержит конфигурацию вашего приложения. Это также интерфейс между сервлетом и контейнером сервлетов. ServletContext создает на старте web приложения, позволяет сервлетам и JSP получать доступ к параметрам конфигурации, описанным в web.xml, а также обмениваться данными внутри приложения. Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file. There is one context per "web application" per Java Virtual Machine. В Spring, аналогичный по смыслу, но более объемный по возможностям, объект называется ApplicationContext, что более конкретно в определении выполняемых им функций. Аналогично, контекста запроса - это совокупность параметров и среды исполнения, которые доступны для данного запроса. Например, относящиеся только к запросу аттрибуты и HTTP заголовки. Контекст web приложения - это по сути само web приложение в runtime.

Создание REST API Java EE

#java #spring #java_ee #rest


Дано: встала задача написания простенького REST API, состоящего буквально из нескольких
методов. На вход подаем несколько параметров, на выходе JSON. Нет необходимости работать
через браузер, то есть никаких страниц красивого отображения всего этого не требуется(может
тогда даже более корректно это назвать Веб-сервисом?). Нагрузка предполагается небольшая.

Естественно потребуется какая либо авторизация. В голове сложилась такая схема: при
успешной авторизации пользователю передается токен, который в дальнейшем передается
при каждом запросе к API. На бэкэнде соответственно проверка этого токена.

Что имею: 


так как Java мне наиболее близка, выбор пал на нее; 
сборка maven;
в качестве фреймворка был выбран Spring; 
сервер Apache Tomcat v8; 
текущая база MSSQL.


Вопрос: насколько данный стек технологий целесообразен для решения такой задачи,
не является ли это "стрельбой из пушки по воробьям"? 

Где то слышал что Tomcat не поддерживает Java EE, или не полностью поддерживает,
так ли это?

Вопрос конечно общий, но хотелось бы знать ваше мнение, что бы заведомо не пойти
ложным путем.

Заранее спасибо за ответ.

PS: про Node.js слышал, но как то не сложилось по техническим причинам)
А может не заморачиваться и заюзать PHP)
    


Ответы

Ответ 1



Да. Tomcat это просто сервлет-контейнер и по сути не является J2EE-сервером, т.к. не имплементирует все необходимые EE-спецификации. Но они вам и не нужны, если вы используете Spring-фреймворк. Выбранные вами технологии вполне подойдут для решения вашей задачи. Также советую для легкого конфигурирования использовать Spring Boot, который обеспечит вам множество уже готовых возможностей. Для работы с БД обратите внимание на Spring Data-JPA. В вашем случае даже можно еще более упростить решение, используя Spring Data-Rest Пример того как можно за 15минут создать простой RESTfull веб-сервис на Spring Data-Rest и Spring Boot.

четверг, 2 января 2020 г.

Почему Servlet имеет такое название?

#java #java_ee #servlet #терминология


Почему "Servlet" имеет такое название? От куда пошло это название? От чего оно происходт?
    


Ответы

Ответ 1



Согласно wiktionary слово Servlet образовано из слов server +‎ applet, где последнее, согласно той же wiktionary образовано из app (сокращение от Application) с приставкой let, обозначающей малый размер В итоге, получается, должно обозначать Маленькая серверная программа

среда, 1 января 2020 г.

Фильтры в сервлетах

#java_ee #java #сервлеты


Изучаю Java EE. Подскажите, пожалуйста, примеры кода и приложения с использованием
фильтров в сервлетах. Спасибо!    


Ответы

Ответ 1



Фильтры существуют уже довольно давно, так что примеров просто море http://tutorials.jenkov.com/java-servlets/servlet-filters.html http://onjava.com/pub/a/onjava/2001/05/10/servlet_filters.html http://viralpatel.net/blogs/2009/01/tutorial-java-servlet-filter-example-using-eclipse-apache-tomcat.html http://www.oracle.com/technetwork/java/interceptingfilter-142169.html Вот очень хороший пример о том, как рулить HTTP-заголовками с помощью фильтров: http://onjava.com/pub/a/onjava/2004/03/03/filters.html?page=1 Вот пример использования для контроля доступа: http://www.developer.com/security/article.php/3467801/Securing-J2EE-Applications-with-a-Servlet-Filter.htm Вот пример фильтра для добавления gzip-сжатия (glassfish и так его поддерживает, но с некоторыми особенностями): http://www.tidytutorials.com/2010/03/java-servlet-proxy-with-compression.html Тут просто солянка из нескольких применений: http://www.oracle.com/technetwork/java/filters-137243.html

вторник, 31 декабря 2019 г.

Java EE (Jakarta EE) и rest

#java #java_ee #rest


Насколько принято или не принято писать Rest API с использованием Java EE?

Спасибо.
    


Ответы

Ответ 1



Тут сложно ответить, так как у каждого будет свой опыт. Если в общем, то Spring появился как ответ на сложность Java EE. Разработчики посмотрели предложенную имплементацию и сказали, что все вот это не должно быть таким сложным. Другое дело, что со временем Spring очень сильно разросся и по сложности может уже посоперничать с Java EE. Но история повторяется по кругу - чтобы снизить порог вхождения, появился Spring Boot. Справедливости ради, стоит отметить, что комитет JCP постарался учесть критику и максимально упростить все, что только можно; но процесс уже был запущен и разработчики так и не вернулись к Java EE в основной своей массе. В общем-то, среднее приложение на стеке Java EE не так уж сильно и отличается от Spring-приложения. Хотя приложение на Java EE может работать только на Enterprise Application Server'е, а Spring-приложение на чем угодно (привет, Tomcat), да и вообще без сервера. Вследствие этого Spring-приложения более удобны в микросервисной архитектуре. С другой стороны, приложения на базе Java EE считаются более подходящими для написания монолитов, в силу чуть более удобной масштабируемости. Кроме того, более частые релизы Spring (чуть ли не раз в месяц, против 2-3 лет в Java EE) позволяют первому учитывать все новые технологии и быть всегда немного впереди. Как я заметил, новые проекты пишутся либо на Spring, либо на каких-то микро-фреймворках. Java EE - это либо поддержка старых проектов, которые были начаты еще до появления Spring, либо что-то из банковской сферы или гос-учреждений, где смена технологий происходит очень медленно. Но еще раз повторюсь, это только мой опыт, он может быть несколько специфичным.

воскресенье, 29 декабря 2019 г.

Как работает аннотация @Inject?

#java #java_ee


Я новичок только учу @Inject. Я не очень понимаю, как он работает. Вот у меня есть поле: 

@Injection
private A a;

И я могу использовать в своем коде a, хотя я не писал new. Правильно я понимаю, что
@Inject просто объявляет a = new A? А что делать, если у меня класс B наследуется от
A и я хочу сделать a = new B;?

И зачем так писать, почему не написать A a = new A(); ???

Спасибо все помогли

Появился еще вопрос Если аннотация лучше то мне теперь всегда в полях использовать
аннотации вместо new?
    


Ответы

Ответ 1



Начнем по порядку Вопрос: Правильно я понимаю, что @Inject просто объявляет a = new A? Ответ: Не всегда. Все зависит от scopa для бина. Если scope выставлен как prototype то да, для каждого поля будет создаваться новый объект. Но как правило, например в spring значение по умолчанию это singleton. те создается один объект который затем присвается всем полям Вопрос: А что делать, если у меня класс B наследуется от A и я хочу сделать a = new B? Ответ: Ничего, с вашей стороны, никаких действий не требуется. DI фреймворки достаточны умны, чтобы обрабатывать подобные ситуации Вопрос: И зачем так писать, почему не написать A a = new A()? Ответ: Все это нужно для уменьшения связанности. Это позволяет более гибко изменять реализацию. Обычно, в роли А выступает какой нибудь интерфейс. И если в коде вы напишете А а = new AImpl(); то в какой то момент, когда захотите поменять реализацию на NewAImpl вам потребуется везде изменять код. Это не удобно, если таких мест много. А если учитывать, что в каждом бине есть свои зависимости, то задача усложняется еще больше

Ответ 2



Эта концепция называется Внедрение зависимостей или dependency injection, в целом она позволяет получить более лаконичный код, уменьшить связность, и уменьшить возможные трудозатраты на поддержку кода в дальнейшем(задел на будущее). Суть в следующем, есть объект-инжектор, при старте приложения Вы говорите ему: создай мне экземпляр класса A, он создает его, затем при помощи reflection ищет все поля, помеченные аннотацией @Inject и создает их вышеописанным же образом. Польза в этом следующая: при разработке отдельных модулей Вы можете не оперировать конкретными объектами, а писать интерфейсы и создавать их экземпляры, не зная при этом их фактической реализации. Например когда вы пишете @Inject MyInterface foo; при этом при конфигурации инжектора у вас указано что, мол, когда встретишь MyInterface создавай MyImplementation.class, то инжектор создаст класс MyImplementation.class и присвоит полю foo ссылку на него Но и недостатки тоже есть - в некоторых ситуациях сложно будет писать юнит тесты, так же, вы можете узнать каким будет класс только в рантайме, т.е. если в проекте сложная логика, не всегда очевидно что в поле заинжектится, последнее затрудняет например навигацию в ide, и еще один немаловажный фактор - порог вхождения(иначе бы не пришлось Вам это здесь расписывать), т.е. если Вы втягиваете DI в свой проект, новички могут слегка просесть по началу, увидев его.

Ответ 3



Суть в том, что какой именно из наследников будет в поле private A a определяет не тот класс, в котором это поле объявлено. Чтобы можно было подсунуть любую реализацию класса/интерфейса A извне. Т.е. если вы напишите A a = new B(); в каждом классе, в котором будет использоваться эта реализация A, то потом если вас попросят заменить на новый класс - например на новый наследник C implements A то вам придется руками это исправлять в каждом классе. А если речь идет о сотнях классов, то это будет тяжело