Java шпаргалка

Файл application.properties

Большой список всевозможных свойств и описаний к ним

https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#data-properties

Получение значения параметра свойства

Надо пометить переменную наподобие такого

@Value("${app.rest.employee.count-on-page}") /* работает только на не статическом поле*/
public int countOnPage;

Spring инициализация

Запуск своего кода при загрузке Spring

@Component
private class Starter implements CommandLineRunner {
   @Override
   public void run(String... args) {
      //todo
   }
}

i18n Internalization

Поддержка языков при использовании Spring Boot.

Достаточно определить бин:

	@Bean
	public MessageSource messageSource() {
		ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
		messageSource.setCacheSeconds(3600); //refresh cache once per hour
		messageSource.setDefaultEncoding("UTF-8");
		messageSource.setFallbackToSystemLocale(false);
		messageSource.setBasenames("classpath:locale/messages/app");
		return messageSource;
	}

И разместить бандлы в указанном месте (locale/messages/app). Т.е.:

src/main/resources/locale/messages/app.properties

и
src/main/resources/locale/messages/app_ru.properties

В этом случае если браузер желает русскую локаль, то ему будет отдан app_ru.properties, в противном случае — app.properties

Также можно переопределить логику определения текущей локали с помощют объявления бина :

@Bean
	public LocaleResolver localeResolver() {
		SessionLocaleResolver slr = new SessionLocaleResolver();
		slr.setDefaultLocale(Locale.forLanguageTag("ru"));
		return slr;
	}

Если этого не сделать SpringBoot будет использовать

org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver.class
в нём можно ставить брейкпоинты.

Таким образом, если не переопределять LocaleResolver, то локаль будет определяться их хэдеров запроса.

Более подробно написано тут https://knasys.ru/spring-boot-i18n-thymeleaf/


Аннотации

Как переиспользлвать настроенную аннотацию @Pattern

Если Вы много где используете настроенную аннотацию @Pattern, например,

1
@Pattern (regexp = "^\\+[0-9]{11,16}$", message = "{constraints.phoneIncorrectFormat}")

, то Вы можете её сохранить как свою кастомную аннотацию так:

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Pattern;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Pattern(regexp = "^\\+[0-9]{11,16}$", message = "{constraints.phoneIncorrectFormat}")
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface PhonePattern {

    /**
     * @return the error message template
     */
    String message() default "{constraints.phoneIncorrectFormat}";

    /**
     * @return the groups the constraint belongs to
     */
    Class<?>[] groups() default { };

    /**
     * @return the payload associated to the constraint
     */
    Class<? extends Payload>[] payload() default { };
}

Тестирование

Подмена бина при тестировании

Просто объявляем этот бин в конфигурации, используя другое имя. А затем автовайрим с использованием аннотации Qualifier. Класс теста:

@SpringBootTest
@ContextConfiguration(classes = {SmsDeliveryServiceImplTestConfig.class})
class SmsDeliveryServiceTest {

    @Autowired
    @Qualifier("SmsDeliveryServiceForTesting")
    SmsDeliveryService smsDeliveryService;

    @Test
    void testmethod() {
    .........

Класс конфигурации:

@TestConfiguration
class SmsDeliveryServiceImplTestConfig {
    @Bean(name = "SmsDeliveryServiceForTesting")
    public SmsDeliveryService smsDeliveryService(SmsSender smsSender) {
        Duration[] smsPauseTime = new Duration[]{
                Duration.ofMillis(200),
                Duration.ofMillis(600),
                Duration.ofMillis(1400)
        };
        Duration timeForResetPauseTime = Duration.ofMillis(2500);
        TemporalUnit temporalUnit = ChronoUnit.MILLIS;
        return new SmsDeliveryService(smsSender, smsPauseTime, timeForResetPauseTime, temporalUnit);
    }
}
(Просмотрено 24 раз, 1 раз за сегодня)
Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий