Java Portal | Программирование
12.7K subscribers
1.25K photos
104 videos
38 files
1.2K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Какой SQL-запрос будет выполнен при вызове метода findByEmail()?

1. SELECT * FROM users WHERE email LIKE ?

2. SELECT id, name, email FROM users WHERE email LIKE ?

3. SELECT * FROM users WHERE email = ? LIMIT 1

4. SELECT * FROM users WHERE email = ?

5. SELECT * FROM users WHERE email = email

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: используй @SpringBootApplication(exclude = …), чтобы отключить конкретные классы автоконфигурации.

Одна из возможных причин: кастомная конфигурация конфликтует с дефолтной.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
java.evolved это подборка, где каждый старый паттерн из Java показан рядом с его современным заменителем, прямо бок о бок.

👍👍👍

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥2👍1
Совет по Spring Boot: если тебе нужны интеграционные тесты для контроллеров Spring MVC, а всё остальное ты хочешь замокать, используй @WebMvcTest — он поднимет только MVC-бины (контроллеры, конфиг MVC, конвертеры, валидацию и т.п.), без полного контекста приложения.

▪️Он грузит только MVC-бины, а не весь application context целиком.

▪️Интеграционные тесты медленнее юнитов, поэтому их стоит ускорять, выкидывая все лишнее, что не нужно конкретно для MVC.

▪️В этом примере мы мокaем бин HelloService и поднимаем только MVC-контекст и сам контроллер:

@WebMvcTest(HelloController.class)
class HelloControllerTest {

@Autowired
private MockMvc mockMvc;

@MockBean
private HelloService helloService; // замокано

@Test
void sayHello_returnsExpectedMessage() throws Exception {
given(helloService.getMessage()).willReturn("Hello!");
mockMvc.perform(get("/api/hello"))
.andExpect(status().isOk())
.andExpect(content().string("Hello!"));
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: Используй ResponseEntity<T>, чтобы получить тонкий контроль над HTTP-ответом.

Можно явно задать status, headers и body.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Вопрос для интервью по Spring Boot:

Когда ты делаешь REST API в Spring Boot, часто используют префикс /api для всех контроллеров.
Но добавлять @RequestMapping("/api") в каждый контроллер неудобно и захламляет код.

Есть ли способ проще, чтобы не писать это на каждом контроллере?

Да: можно задать единый префикс через конфигурацию.

@Configuration
class WebMvcConfig implements WebMvcConfigurer {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/api",
aClass -> aClass.getPackage().getName()
.startsWith("com.sivalabs.bookstore"));
}
}


Так ты автоматически добавляешь /api ко всем контроллерам из нужного пакета, а код контроллеров остается чистым.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Java Stream API Evolution (с Java 8 до Java 21).

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👀3
Тестируете JBoss или другие Java application servers? 🧐

JexBoss это Python-инструмент для проверки серверов JBoss на известные уязвимости, включая проблемы с Java deserialization в ряде фреймворков (JSF, Seam, Jenkins, Struts2 и др.). Есть режим автопроверки сетей (скан диапазонов CIDR) для инвентаризации и поиска потенциально уязвимых узлов.

https://github.com/joaomatosf/jexboss

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Какой будет результат выполнения кода?

{"name":"Laptop"}
{"name":"Laptop","price":50000}
{"price":50000}
{}
→ Ошибка компиляции

Примечание: по умолчанию при сериализации/десериализации Jackson опирается на спецификацию JavaBeans, то есть учитываются только методы getter и setter.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Продвинутый Map в Java (надо знать)

Если ты хоть раз делал Map<String, List<String>>, этот пост для тебя.

Признайся, все когда-то писали так:

Map<String, List<String>> userTags = new HashMap<>();
userTags.computeIfAbsent("user123", k -> new ArrayList<>()).add("premium");
userTags.computeIfAbsent("user123", k -> new ArrayList<>()).add("verified");


Или вообще вот так:

if (!userTags.containsKey("user123")) {
userTags.put("user123", new ArrayList<>());
}
userTags.get("user123").add("premium");


==> В Apache Commons Collections уже давно есть готовая штука: MultiValuedMap.

Что это такое

MultiValuedMap<K, V> это структура данных, которая позволяет хранить несколько значений на один ключ. По сути это Map<K, Collection<V>>, но с нормальным, удобным API.

MultiValuedMap<String, String> userTags = new ArrayListValuedHashMap<>();

userTags.put("user123", "premium");
userTags.put("user123", "verified");
userTags.put("user123", "early-adopter");

// Забрать все теги сразу
Collection<String> tags = userTags.get("user123");
// [premium, verified, early-adopter]


Никаких computeIfAbsent, никаких проверок на null. Просто работает.

Что умеет

- Добавление без боли:

multiMap.put("key", "value1");
multiMap.put("key", "value2"); // не затирает предыдущее значение


- Массовые операции:

multiMap.putAll("user456", Arrays.asList("admin", "moderator"));


- Проверка существования конкретной пары:

multiMap.containsMapping("user123", "premium"); // true/false


- Удаление конкретного значения у ключа:

multiMap.removeMapping("user123", "premium");


- Получить вообще все значения:

Collection<String> allTags = multiMap.values();
// все значения со всех ключей


Реализации

- ArrayListValuedHashMap<K, V> — значения хранятся в ArrayList, порядок сохраняется, дубликаты возможны
- HashSetValuedHashMap<K, V> — значения хранятся в HashSet, без дублей

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥5👀5👍2🤔1
Java Collections Framework

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3😁1
Знания по базам данных на техсобесах игнорировать нельзя.

Честно, многие реально боятся DB. И когда бэкендер не может сходу написать обычный, часто используемый запрос, его шансы пройти начинают заметно проседать.

Один из ключевых концептов тут это JOIN.

Я собрал понятную шпаргалку по SQL JOIN: с примерами и визуализацией, чтобы быстро уложить в голове.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍1💊1