Ответы пользователя по тегу Java
  • Разные ДТО для создания/получения объектов VS один ДТО, но запретить сериализацию null?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Как по мне лучше создавать отдельный DTO на каждую нужду вместо того, чтобы скомпоновать все в один.
    Например, UserCreationDTO, UserRequestDTO, UserResponseDTO и т.д.
    Ответ написан
    3 комментария
  • Стоит ли бросать кастомные ошибки, если этити не найдено в API?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Наверное, это зависит от того, как вы в команде договоритесь.
    Вы можете выбрасывать кастомные эксепшены, а далее ловить их в Controller или ControllerAdvice и отдавать соответствующее сообщение на клиент с кодом ошибки.
    Также можно обернуть entity в Optional и выбрасывать исключение orElseThrow() или возвращать другой объект (orElse()) или новый объект и т.д.

    Optional<Vote> voteOptional = voteRepository.findById(voteId);
            if(voteOptional.isEmpty()) {
                throw new ApiException("Vote with id " + id  + 
                        "is not in DB");
            }

    Можно же упростить:
    Vote vote = voteRepository.findById(voteId).orElseThrow(VoteNotFoundException::new);


    Но с другой стороны, если с фронта все правильно настроено, то таких ситуаций и не должно быть.

    не нужно надеяться на клиент. Например, человек может сам совершить запрос при помощи Postman и передать некорректное значение.
    Ответ написан
    8 комментариев
  • Где будет правильно расположить методы конвертации дто -> ентити и наоборот?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!

    Разместить прямо в дто в каждом.

    Почему бы вам не добавить методы конвертации в сервисный слой, где вы пишете вашу бизнес логику.
    Например, у вас есть entity User & dto - UserCreationDto. В сервисном слое UserService создайте 2 метода, которые конвертируют entity < -- > dto.
    Если вы используете встроенные возможности Spring (Converter<S, T>), то для каждого entity нужно создать свой класс. Что касается расположения пакетов, то есть разные практики. Например, в пакет user закинуть User, UserCreationDto, UserRepository, UserService, UserToDtoConverter и т.д.
    Если вы никак не кастомизируете процесс конвертации, то можно написать один базовый класс с использованием generics.
    Вот, простой пример для ModelMapper:
    @Service
    @RequiredArgsConstructor
    public class MapperService {
    
      private final ModelMapper modelMapper;
    
      /**
       * Note: outClass object must have default constructor with no arguments
       *
       * @param <D> type of result object.
       * @param <T> type of source object to map from.
       * @param entity entity that needs to be mapped.
       * @param outClass class of result object.
       * @return new object of <code>outClass</code> type.
       */
      public <D, T> D map(final T entity, Class<D> outClass) {
        return modelMapper.map(entity, outClass);
      }
    
      /**
       * Note: outClass object must have default constructor with no arguments
       *
       * @param entityList list of entities that needs to be mapped
       * @param outCLass class of result list element
       * @param <D> type of objects in result list
       * @param <T> type of entity in <code>entityList</code>
       * @return list of mapped object with <code><D></code> type.
       */
      public <D, T> List<D> mapAll(final Collection<T> entityList, Class<D> outCLass) {
        return entityList.stream().map(entity -> map(entity, outCLass)).collect(Collectors.toList());
      }
    
      /**
       * Maps {@code source} to {@code destination}.
       *
       * @param source object to map from
       * @param destination object to map to
       */
      public <S, D> D map(final S source, D destination) {
        modelMapper.map(source, destination);
        return destination;
      }
    }


    Создать отдельный класс DTOUtils и все туда скинуть ( но тогда там вперемешку будут методы конвертации всех классов )

    Не самая лучшая идея. Лучше так не делать. Вспоминаем про принцип единственной ответственности. (SOLID).

    Сделать пакет dtoutils и там создать много классов ( для каждого дто свой, они будут только хранить дто методы и все )

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

    3 вариант выглядит как самый благоразумный, но создавать отдельный класс для одного метода это как-то не очень.

    Это вот, как раз тот случай, когда вы используете интерфейс Converter<S, T>
    https://docs.spring.io/spring-framework/docs/curre...
    Если не хотите создавать по одному классу на каждый dto, то можете глянуть на код указанный выше. Может, это будет для вас полезно
    Ответ написан
    4 комментария
  • Не могу найти что-то на что можно нажать. Как нажать на элемент?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Нажать можно на все что угодно, все зависит от того на что повешено событие (event).
    В данном случае событие висит на элементе div
    Вот, селектор div.card.mt-4.top-card
    O7JNhGv.png
    Ответ написан
    Комментировать
  • Как распространять программу java вместе с базой данных?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Можно использовать h2 БД. Его можно встраивать, а также сохранять в файловой системе. Также можно глянуть в сторону sqlite. Или же можно использовать postgres embedded.
    Для удобства работы с выбранной БД используйте ORM (hibernate, ormlite и др)
    Ответ написан
    Комментировать
  • Что использовать для авторизации/аутентификации пользователя на бекенде?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Почему бы вам не использовать Spring Boot + Spring Security? И добавить туда библиотеку, которую сами же указали - jjwt. Будет намного быстрее и проще. Но можно и без Spring'a обойтись.
    Ответ написан
  • Сохранение действий пользователя в программе java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    1) Начнем с того, что вам нужно выбрать БД, в которой будете хранить данные. Например, sqlite.
    https://www.sqlite.org/index.html
    2) Вам нужен драйвер для работы с выбранной вами БД. В java - jdbc.
    https://github.com/xerial/sqlite-jdbc
    Для удобства можете освоить технологию ORM и изучить hibernate или mybatis и др. Можно взять минимум - ormlite.
    3) Далее вы получаете информацию введенную пользователем, при необходимости валидируете ее и записываете в БД.
    4) При последующем старте приложения данные в JTable заполняются из БД.
    https://www.youtube.com/watch?v=jpGn8rd_3Sc
    Ответ написан
    Комментировать
  • Какие есть способы организовать "общение" android-приложения с сервером?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Организовать "связь" для клиент-серверного приложения можно по http (спецификация REST), через soap, а также через сокеты и т.д.
    Довольно часто используется именно первый вариант. Есть куча библиотек и фреймворков для реализации. Вопрос, что именно вас интересует? Клиентская или серверная часть. Если речь о серверной части, то можно использовать Spring Web, Spring REST Repositories, Spring Webflux и др. Если речь о клиентской части, то у спринга есть Spring REST Android. А также можно использовать Retrofit, okHttp и т.д.
    Если речь идет о веб-сокетах, то можно на сервере использовать Spring Websockets или еще что
    Ответ написан
    Комментировать
  • Как сохранить фотографии в альбом вк при помощи vk api?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Вы получили json в ответе.
    Теперь, вам необходимо десериализовать ответ в объект.
    Можно использовать библиотеки jackson или gson или же можно использовать DOM Parser (встроенные средства java).

    Тут можете сгенерировать структуру json:
    https://www.jsonschema2pojo.org/

    Вот, для jackson:
    import java.util.List;
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "markers_restarted",
    "photo",
    "sizes",
    "latitude",
    "longitude",
    "kid",
    "sizes2",
    "urls",
    "urls2"
    })
    @Generated("jsonschema2pojo")
    public class Photos {
    
    @JsonProperty("markers_restarted")
    public Boolean markersRestarted;
    @JsonProperty("photo")
    public String photo;
    @JsonProperty("sizes")
    public List<Object> sizes = null;
    @JsonProperty("latitude")
    public Integer latitude;
    @JsonProperty("longitude")
    public Integer longitude;
    @JsonProperty("kid")
    public String kid;
    @JsonProperty("sizes2")
    public List<List<String>> sizes2 = null;
    @JsonProperty("urls")
    public List<Object> urls = null;
    @JsonProperty("urls2")
    public List<String> urls2 = null;
    
    }


    import java.util.List;
    import javax.annotation.Generated;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonPropertyOrder({
    "server",
    "photos_list",
    "aid",
    "hash"
    })
    @Generated("jsonschema2pojo")
    public class Example {
    
    @JsonProperty("server")
    public Integer server;
    @JsonProperty("photos_list")
    public List<Photos> photosList = null;
    @JsonProperty("aid")
    public Integer aid;
    @JsonProperty("hash")
    public String hash;
    
    }
    Ответ написан
  • Как обработать AuthenticationException в контроллере?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Исключения можно обработать на глобальном уровне при помощи @ControllerAdvice или же обработать на уровне контроллера.
    Обратите внимание на раздел "Global Exception Handling"по ссылке ниже

    Вот, тут ссылка на полезную статью по вашему вопросу:
    https://spring.io/blog/2013/11/01/exception-handli...
    Обратите внимание на раздел - Controller Based Exception Handling @ExceptionHandler

    Вопрос заключается в том, как обработать данное исключение, чтобы получить сообщение из исключения и поместить его во вьюшку?

    Лучше не выводить внутреннее состояние (исключения) вашего приложения на фронт, так как это может потенциально нарушить безопасность вашего приложения. Поймайте исключение, а во вью поместите другое сообщение. Например, "Аутентификация не удалась"
    Ответ написан
    5 комментариев
  • В чем разница между Java разработчиком и разработчиком ПО (software developer)? И может ли Java разработчик работать Andorid разработчиком?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Разработчик ПО - говоря проще, разработчик, который пишет программы (программист). Писать программы можно на разных языках, в том числе и на Java. А значит, Java разработчик является разработчиком ПО.
    Android разработчик это своего рода подвид java разработчика, если он разрабатывает андроид приложения на java. Помимо андроид разработчика есть например, промышленная разработка ПО на Java (enterprise). Но также андроид разработка является отдельным направлением, так как на сегодняшний день приложения в большей степени разрабатывают на kotlin
    Ответ написан
    7 комментариев
  • Как озвучить текст?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Не знаю поможет ли вам это. но у гугла есть такой сервис:
    https://cloud.google.com/text-to-speech/docs/voices

    Вот, еще:
    www.voicerss.org/api

    Гуглим
    Ответ написан
    Комментировать
  • Не работает оператор sendKeys в Selenium, в чем причина?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    .input__control input__input mini-suggest__input
    У вас селектор некорректный
    должно быть так:
    .input__control.input__input.mini-suggest__input
    Ответ написан
    Комментировать
  • Почему не происходит авторизация в Spring security?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Сделаю смелое предположение:

    Вот, тут вы разрешили отправлять запросы на url/login
    .antMatchers("/").permitAll()
        			.antMatchers("/login").permitAll()


    А тут говорите, что страницей аутентификации является /auth
    .loginPage("/auth")

    В форме вы отправляете запрос на action="@{/auth}" А отправлять запрос на указанный урл вам просто не разрешено и вы получите 403 permission denied.
    Добавьте в конфиг:
    .antMatchers("/auth").permitAll()
    Ответ написан
  • Почему Maven не видит ссылки к Selenium?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Во-первых, у вас <version>Latest</version>, вместо Latest должна быть версия.
    Гляньте тут на актуальную стабильную версию - https://mvnrepository.com/artifact/org.seleniumhq....

    Далее не забудьте обновить конфигурацию maven.
    Если это не решит вашу проблему, то попробуйте File -> Invalidate Caches & Restart
    Ответ написан
    Комментировать
  • Как прочитать варианты клетки-дропдауна из Excel-таблицы?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Возможно, информация по ссылке будет полезна для вас. Тут ответ на аналогичный вопрос:
    (обратите внимание на оба ответа)
    https://stackoverflow.com/questions/21181551/read-...

    Также по теме:
    https://stackoverflow.com/questions/51017694/apach...
    Ответ написан
    Комментировать
  • Как в rest-контроллере принимать данные формы, у которой может меняться количество полей?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Обычно, есть отдельный контроллер ответственный за загрузку файлов. Можно создать некий RestController, на который аяксом отправляются загружаемые файлы, а в ответе возвращать id файла хранимого в БД после загрузки.

    Если вы решили реализовать тем способом, которым вы сейчас это делаете, то почему бы вам не попробовать использовать модель (DTO). Создайте pojo нужной структуры, если есть обязательные поля, которые должны присутствовать, то используйте либу spring validation.

    При необходимости, используйте ModelMapper или Struts или класс Converter<S, T> для конвертации dto в entity
    Ответ написан
  • Как зарегистрировать спринговый сервис в рантайме?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Вот, наглядная статья по теме:
    https://medium.com/@venkivenki4b6/spring-dynamical...
    Обратите внимание на пункт 4
    This can be done in many ways. We will be discussing the following with examples.
    
        GenericBeanDefinition
        BeanDefinitionBuilder
        BeanFactoryPostProcessor
        BeanDefinitionRegistryPostProcessor


    Вот, еще по теме:
    https://stackoverflow.com/questions/57157396/how-t...
    Ответ написан
    Комментировать
  • Не получается сделать клик по элементу внутри frama. Ошибка ElementNotInteractableException?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Если не ошибаюсь, то вам нужно переключиться на iframe. Вы не можете кликнуть на его элементы не переключившись на него.
    Полезная ссылка по теме:
    https://www.guru99.com/handling-iframes-selenium.html

    It is impossible to click iframe directly through XPath since it is an iframe. First we have to switch to the frame and then we can click using xpath.


    Вот, как происходит переключение на фрейм (прочитайте статью по ссылке выше):
    driver.switchTo().frame("a077aa5e");
    Ответ написан
  • Почему на JSP странице русские символы отображаются кракозябрами?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    Я использую properties-файлы, в которых на нужном языке пишу текст. Нужно проверить, чтобы текст в данных файлах был установлен как UTF-8

    Если не ошибаюсь, то в properties используется кодировка ISO 8859-1
    Вот, похожий вопрос касаемый кодировки файла properties
    https://stackoverflow.com/questions/37436927/utf-8...

    Что касается ваших крякозабров, то основываясь на этой инфографике
    https://evc27.pcloud.com/dpZCsmjtXZHvQPG0Z4gx7Z7Zj...
    У вас UTF-8 кодировка, которая отображается в win-1252

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

    И еще вариант в html должна быть указана кодировка utf-8 внутри тега head
    <head>
      <meta charset="UTF-8">
    </head>
    Ответ написан