• Почему JdbcTemplate не выполняет query с параметрами?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Нужен вообще другой темплейт, JDBC так не умеет.

    https://www.javatpoint.com/spring-NamedParameterJd...

    jdbcTemplate.execute(" CREATE TABLE test (id BIGINT PRIMARY KEY, test_id VARCHAR(50));");
            Map<String, String> parameters = new HashMap();
            parameters.put("test_id", "test");
            jdbcTemplate2.execute(
                    "INSERT INTO test (id, test_id) VALUES (1, :test_id)",
                    parameters,
                    (PreparedStatementCallback) PreparedStatement::executeUpdate
            );
    Ответ написан
    Комментировать
  • Почему эксоузинг пути к api неправильный?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Маппинг экспоузера верный. Просто я обновлял код с уже запущенным сервером, а такие вещи требуют ребута.
    Ответ написан
    Комментировать
  • Как запустить etcd как отдельный сервис с помощью docker?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Я неправильно пробрасывал порты.

    docker run -p 2379:2379 --name etcd quay.io/coreos/etcd:v3.0.16 /usr/local/bin/etcd -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379


    В окошке терминала запускается контейнер.

    Если открыть другое окно терминала и посмотерть через docker ps, то получим:
    CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                              NAMES
    1cf15da0a83a        quay.io/coreos/etcd:v3.0.16   "/usr/local/bin/etcd…"   5 minutes ago       Up 5 minutes        0.0.0.0:2379->2379/tcp, 2380/tcp   etcd


    Так-же можно положить что-либо в etcd и получить ответ:
    curl -L http://localhost:2379/v2/keys/mykey -XPUT -d value="this is awesome"


    Ответ -
    {"action":"set","node":{"key":"/mykey","value":"this is awesome","modifiedIndex":4,"createdIndex":4}}
    Ответ написан
    Комментировать
  • Как сделать двойной join в criteria api?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    решил.

    Сначала джойню A <- B, поотом B <- C

    // Join and predicate ontSerialNumber from Subscriber NeProfile 
                Optional.ofNullable(requestAssuranceAccessLine.getOntSerialNumber()).ifPresent(ontSerialNumber -> {
                            Join<DefaultNeProfile, AccessLine> joinedDefaultNeProfile = root.join("defaultNeProfile");
                            Join<SubscriberNeProfile, DefaultNeProfile> joinedSubscriberNeProfile = joinedDefaultNeProfile.join("subscriberNeProfile");
                            predicates.add(criteriaBuilder.equal(joinedSubscriberNeProfile.get("ontSerialNumber"), ontSerialNumber));
                        }
                );
    Ответ написан
    Комментировать
  • Как наконец попасть на собеседование Java junior разработчика?

    SlandShow
    @SlandShow
    70% of my body is made of movies.
    Мне кажется, что Вам надо немного поучить веб-фреймворки: node.js, react, angular и тд. Ну и помимо всего, раз знаете спринг и сервлеты, то лучше подтянуть SQL (не увидел у вас конкретно него).

    И не забывайте про то, что может сейчас Вам не очень везёт с работой, но нужная компания в итоге пригласит Вас к себе.

    P.S: для хантера было бы неплохо прикрепить линки на деплойт ваших работ, если такое имеет место быть.
    Ответ написан
    2 комментария
  • Как мне реализовать передачу сообщений между Tomcat и WildFly через JMS?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    RabbitMQ
    Ответ написан
    Комментировать
  • Почему среда пишет, что у меня нету маппинга сервлета?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Разобрался.

    Project Structure -> Modules -> Добавить дескриптор развёртывания web.xml

    https://stackoverflow.com/questions/43153904/servl...
    Ответ написан
    Комментировать
  • Никак не могу настроить порты WildFly. Что делать?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Поставил кастомные настройки и поменял порт 8080 на 8181. Он был занят томкатом - потому и ругался
    Ответ написан
    Комментировать
  • Как исправить неправильный JAVA_PATH?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Разобрался.

    JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export PATH=$JAVA_HOME/bin:$PATH
    Ответ написан
    Комментировать
  • Почему stack оказывается пустым?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Ошибка была в неправильном парсинге постфиксной нотации. У меня сначала была проверка на то, что итерируемый элемент - число, а стоило мне поменять местами эти проверки (сначала проверяю итерируемый элемент на оператор) - всё заработало.

    Вот незначительная правка кода:
    private void parse() {
            String currentElement = "";
            String[] elements = regular.split(" ");
            double number1, number2, interAns;
    
            for (int i = 0; i < elements.length; i++) {
                currentElement = elements[i];
    
                // Check if current element is operator
              	if (isOperator(currentElement)) {
                  	if (stack.size() > 1 && !currentElement.equals("")) {
                      	 number2 = stack.pop();
                       	 number1 = stack.pop();
    
                       	 // Make calculations
                       	 if (currentElement.equals("+"))
                            interAns = number1 + number2;
                       	 else if (currentElement.equals("-"))
                            interAns = number1 - number2;
                      	 else if (currentElement.equals("*"))
                            interAns = number1 * number2;
                       	 else if (currentElement.equals("/"))
                            interAns = number1 / number2;
                       	 else interAns = 0;
    
                        stack.push(interAns);
                    }
                } else {
                  	try {
                   		double element = Double.parseDouble(currentElement);
                    	stack.push(element);
                    } catch (NumberFormatException e) {
                      	System.out.println("Hmm...");
                    }
                }
              
              
              /*
                try {
                    double element = Double.parseDouble(currentElement);
                    stack.push(element);
                } catch (NumberFormatException e) {
                    if (!currentElement.equals("")) {
                        number2 = stack.pop();
                        number1 = stack.pop();
    
                        // Make calculations
                        if (currentElement.equals("+"))
                            interAns = number1 + number2;
                        else if (currentElement.equals("-"))
                            interAns = number1 - number2;
                        else if (currentElement.equals("*"))
                            interAns = number1 * number2;
                        else if (currentElement.equals("/"))
                            interAns = number1 / number2;
                        else interAns = 0;
    
                        stack.push(interAns);
                    }
                }*/
            }
            interAns = stack.pop();
            result = interAns;
        }
    
    // Новая функция
    private boolean isOperator(String s) {
            return s.equals("+")|| s.equals("-") || s.equals("*") || s.equals("/");
    }


    Раньше мой код не мог парсить вот такие выражения: infix: 12 - 5 * 2 + 16 / 4 - 50 / 10 (postfix is 12 5 2 * - 16 4 / + 50 10 / -) - не совсем понимаю почему, но стоило мне поменять местами сравнения, так всё сразу заработало!

    5a2919e977bb5940625141.png

    Ну и ещё стоит отметить то, как отметил Денис Загаевский , что надо добавить доп.проверку на пустоту стека ( if (stack.size() > 1) ...).
    Ответ написан
    Комментировать
  • Почему приложение не работает при запуске apk файла?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Дело было в другом.

    Сбой разметки и как следствие ничего не работало
    Ответ написан
    Комментировать
  • Почему происходит шибка при создании БД (SQLite)в Android приложении?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    В общем-то проблема была в моей криворукости.

    При создании таблицы я написал вот это:
    String create_products_table = "CREATE TABLE " + TABLE_PRODUCTS + " (" +
                    COLUMN_ID + " INTEGER PRIMARY KEY, " + COLUMN_PRODUCTNAME + " TEXT," +
                    COLUMN_COAST + " INTEGER, " + COLUMN_INCOME + "INTEGER)";


    И я сам не заметил, но на выходе получил не совсем то, что нужно:
    CREATE TABLE products (_id INTEGER PRIMARY KEY, productname TEXT, coast INTEGER, incomeInteger TEXT);


    Т.е я забыл поставить пробел между COLUMN_INCOME и "INTEGER); и SQLite автоматически определил это как текст.

    126cd13f0c4d46369b67602b96f9cc1e.png
    Ответ написан
  • Как сделать переключающуюся панель?

    SlandShow
    @SlandShow
    70% of my body is made of movies.
    Тут есть один туториал.

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

    1 + 2*3
    (2 - 4) / 5
    9/2 - 3/4
    Ответ написан
    Комментировать
  • Почему информация о типе сохраняется, несмотря на стирание типов?

    SlandShow
    @SlandShow
    70% of my body is made of movies.
    Сначала может показаться, что JVM создает новую версию класса где и заменяет Т на нужный тип. Но на самом деле, JVM частично 'подправляет' уже имеющийся параметризованный класс. В том числе заменяет Т на версию нужного значения каждый раз, когда это требуется. Т.е класс существует один, а не несколько версий с полями разных типов.

    В вашем же случае сначала JVM подправляет T obj на Object obj (который преобразуется нисходящим преобразованием в String) а потом снова подправляет String obj на Object obj (который потом так-же преобразуется в Integer неявно)

    g.set("String");
    f.set(123);



    T obj на самом деле заменяется на Object obj. Этот процесс называется стиранием, который происходит на стадии компиляции. А затем неявно происходит нисходящее преобразование.
    class Test<T> {
    T val; // на самом деле T заменяется на Object
    Test(T o) { val = o; }
    T get() { return val; }
    
    }
    
    class SimpleClass {
    void info() { System.out.println("я метод info() из класса SimpleClass"); }
    }
    
    Test<SimpleClass> v = new Test<>(new SimpleClass());
    
    SimpleClass v2 = v.get(); // при инициализации v2 на самом деле происходит неявное нисходящее преобразование к нужному типу
    
    //что происходит на самом деле:
    //SimpleClass v2 = (SimpleClass) v.get();
    
    v2.info();


    Стирание генерализированных типов происходит на стадии компиляции. В самом простом случае ничем не ограниченный тип стирается до Object`а, обобщенный класс NameClass до NameClass.

    Другими словами информация о дженериках существует только на этапе компиляции и недоступна в runtime.

    Ответ написан
    3 комментария