• Обратная связь Hibernate - null?

    jaxtr
    @jaxtr
    JavaEE/Spring-разработчик
    Что бы получать наборы связанных объектов (@OneToMany и @ManyToMany) нужно указать fetch=FetchType.EAGER в аннотации связи. Это удобно, но есть подводный камень - количество выполняемых запросов к БД увеличится, ровно как и объёмы передаваемых данных.
    Ответ написан
    6 комментариев
  • Как проверить лишние поля @RequestBody?

    / Jackson version 1.9 or earlier
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, true);

    // Jackson 2.0 or later
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
    Ответ написан
    4 комментария
  • Java: Как правильно отправить byte[] (image) что бы потом обработать в json?

    @mr-achehe
    java программист
    Url.urlencode(image.getBase64()) отправить принимаем url.urldecode
    Ответ написан
    Комментировать
  • Что происходит не так с адресацией Views в Spring MVC?

    @mvsavkin
    У вас не настроен бин view resolver. Необходимо создать бин и указать ему префикс(путь до файла) и суффикс(окончание файла).
    Обычно выглядит так:
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                  <property name="prefix" value="/WEB-INF/views/" />
                  <property name="suffix" value=".jsp" />
    </bean>
    Ответ написан
    6 комментариев
  • Выйти из Collection.forEach() по условию?

    OLDRihard
    @OLDRihard
    Java Developer
    Если откинуть всякий сахар что останется? А останется выполнение определенного метода для каждого элемента. И ни 1ое ни второе тут не прокатит.
    Но койчаво я могу посоветовать. Вызывать в начале Stream
    Ответ написан
    Комментировать
  • Выйти из Collection.forEach() по условию?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Если вам такое нужно, то вы неправильно понимаете природу потокового API. forEach() - это не цикл в обычном его императивном понимании. Правильным решением является предварительная фильтрация потока, чтобы в forEach() поступили только нужные значения. Или одно нужное. Если уж очень надо, то из потока можно получить итератор и обойти его в классическом while(iterator.hasNext()).
    Ответ написан
    Комментировать
  • Java: Как правильно отправить byte[] (image) что бы потом обработать в json?

    Rou1997
    @Rou1997
    Изображение в JSON - это перебор, вы где такое видели?
    В JSON надо ссылку на изображение передавать... А лучше только его id, а там пусть JavaScript формирует ссылку с id, поскольку в JSON нужно вообще минимум байт передавать, он и без того не очень быстро парсится.
    Ответ написан
    4 комментария
  • О logback.xml - можно ли указать в каком пакете какой appender использовать?

    @zelan
    Кратко обо мне не получится.
    Я делаю так:

    <configuration debug="false">
       
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%-50class{50} [%-5level]:          %msg%n</Pattern>
            </layout>
        </appender>
        
        <appender name="gui" class="logback.appender.JavaFXAppender">
            <layoutPattern>[%-5level]:    %msg%n</layoutPattern>
        </appender>
    
        <!-- в коде я запрашиваю это логгер по имени, у него добавлен свой аппендер, все что передается в этот логгер - добавляется в добавленные аппендеры.
             если удалить этот логгер, то все, что было адресовано ему - пойдет в root
     -->
        <logger name="cardservices" level="debug"  additivity="false">
            <appender-ref ref="gui" />
        </logger>
    
        <root>
             <appender-ref ref="console" />
        </root>
    
    
    </configuration>


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

    В нужном пакете запрашиваю инициализирую логгер (при помощи обертки slf4j, если не пользуешься - инициализируй методами логбека):

    private static Logger logger = LoggerFactory.getLogger("cardservices");
    
    ...
    //сообщение пойдет в логгер с именем "cardservices" и, соответственно в его аппендеры (для данного примера аппендер "gui".
    logger.info("rere");


    В твоем случае будет как-то так:

    <configuration>
        <appender name="DB_APPENDER" class="com.test.logging.LogCachedAppender">
        </appender>
    
        <logger name="DB_LOGGER" level="debug"  additivity="false">
            <appender-ref ref="DB_APPENDER" />
        </logger>
    
        <root level="debug">
            <appender-ref ref="OTHER_APPERNDER" />
        </root>
    </configuration>


    и в нужном пакете инициализировать логгер:

    private static Logger logger = LoggerFactory.getLogger("DB_LOGGER");
    Ответ написан
    1 комментарий
  • Как пишется псевдо ИИ в играх?

    begemot_sun
    @begemot_sun
    Программист в душе.
    В общем случае читайте про принцип минимакса.
    Вы должны:
    1. описать игровое пространство, что можно делать и чего нельзя.
    2. описать возможные действия бота (ход вправо, влево, стрелять и т.п.)
    3. описать функцию оценивающую текущую обстановку на поле (с учетом положения и состояния всех игроков на поле, или только той части что известный боту)
    4. Руководствуясь принципом минимакса выбрать лучший ход для бота в текущий момент.
    5. Оптимизировать процесс с учетом того, что у вас будет комбинаторный взрыв возможностей.
    Ответ написан
    2 комментария
  • Инкапсуляция, отсутствие её - проблема?

    Отсутсвие инкапсуляции в данном контексте, очевидно, в первую очередь означает излишне обширный публичный интерфейс. А публичный интерфейс разработчик фреймворка просто так менять не может - нужно соблюдать обратную совместимость. Соответственно, чем больше у нас торчит наружу ушей, тем сложнее поддерживать и развивать фреймворк. Достаточно посмотреть на код Битрикса, например, чтобы увидеть к чему это приводит.
    Думаю, вопрос был именно об этом.
    Ответ написан
    Комментировать
  • Многопоточность не завершается?

    @pbahushevich
    Runnable картины не изменит.
    Во-первых комментарии по коду
    while (ivanov.getCountSpeaches() + petrov.getCountSpeaches() + sidorov.getCountSpeaches() < totalCountSpeeches) {
            }

    тут я так понимаю ты ждешь когда все вместе наберут 200 голосов и после этого цикл прекратится и у тебя будут данные о том кто сколько голосов набрал.
    Проблема в том что конец цикла происходит в потоке main, а остальные потоки никак об этом не знают и продолжат работать. И между окончанием цикла и выводом результатов на экран 3 потока успеют много чего сделать и результаты уже будут сильно отличаться. Ну или не сильно ))) т.е. сумма ровно в 200 не сойдется.
    Проблема еще в том что у тебя зависает еще до выхода из цикла и проблема эта решается в строке
    private int countSounds;
    добавлением волшебного слова volatile.
    почему - см. Java Memory Model либо если не поймешь пиши в комменты ))
    Ответ написан
  • Многопоточность не завершается?

    @protven
    Ну а почему вы считаете что у вас "зависло" ? Добавьте отладочную печать, увидите, делает что-то ваш код или нет. Проблем то много может быть, начиная от гонки ресурсов и переполнения инта например.

    while (countSounds < totalCountSpeeches * soundsInOneSpeech) {
                    countSounds++;
                     System.out.println("name -> " + this.getName() + ", " + "count -> " + countSounds);
                }
    Ответ написан
    2 комментария
  • Вызов метода наследника в конструкторе родителя?

    Vestail
    @Vestail
    Software Engineer
    В первом случае т.к. A.initialize() помечен как private, в классе B создается свой собственный метод B.initialize() . Поэтому результат будет 69, сначала выполнится A.initialize(), а после B.initialize(). Но во втором случае этот метод наследуется и переопределяется, поэтому в конструкторе класса А будет вызвана версия Initialize() из B(в java классы по умолчанию виртуальные). Но т.к. производный класс инициализируется после базового, то результат будет 09(поле f1 в классе B еще не успело инициализироваться и содержит стандартное значение, но его уже выводят).
    Ответ написан
    2 комментария