Spring @Validated аннотация предотвращает внедрение значения @ConfigurationProproperties, почему?
Я пытаюсь с @ConfigurationProperties
и я нахожу две вещи:
- чтобы тесты работали, я должен поместить файлы свойств конфигурации (yml) в
test
пакет; сеттеры и пустой конструктор обязательны. - Если я аннотировал класс с
@Validated
Инъекция со всемиnull
ценности.
Если вы говорите, что первое понятно, а второе? Зачем?
Цель состоит в том, чтобы проверить внедрение свойств конфигурации, чтобы значения важных свойств не отсутствовали при запуске приложения.
У меня есть этот yaml на карту:
accertify:
fr:
merchant1:
host: "sandbox.accertify.dev"
protocol: "https"
user: "fraud"
password: "temporal"
merchant: "merchant1FR"
merchant2:
host: "sandbox.accertify.dev"
protocol: "https"
user: "fraud"
password: "temporal"
merchant: "merchant2FR"
es:
merchant1:
host: "sandbox.accertify.dev"
protocol: "https"
user: "fraud"
password: "temporal"
merchant: "merchant1ES"
merchant2:
host: "sandbox.accertify.dev"
protocol: "https"
user: "fraud"
password: "temporal"
merchant: "merchant2ES"
У меня есть этот класс для отображения вложенных конфигураций:
import com.westerngun.fraud.jfps.dto.provider.accertify.country.ConfigurationEs;
import com.westerngun.fraud.jfps.dto.provider.accertify.country.ConfigurationFr;
import com.westerngun.fraud.jfps.service.client.ConnectionDetailsInterface;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
/**
* Class to read Accertify provider connection credentials.
*/
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "accertify")
@Validated // <--- this seems the problem
@NoArgsConstructor
@AllArgsConstructor
public class AccertifyConnectionDetail extends ConnectionDetails {
@Valid
private ConfigurationFr fr;
@Valid
private ConfigurationEs es;
}
И его интерфейс:
public abstract class ConnectionDetails {
public abstract ConfigurationFr getFr();
public abstract ConfigurationEs getEs();
}
А также, ConfigurationEs
а также ConfigurationFr
оба подкласса:
@Component
public class CountryConfigDetail {
@Getter
@Setter
@Valid
private Merchant1 merchant1;
@Getter
@Setter
@Valid
private Merchant2 merchant2;
}
Merchant1
а также Merchant2
подкласс:
@Data
@Component
public class MerchantConfigDetail {
@NotEmpty
@NotNull
private String user;
@NotEmpty
@NotNull
private String password;
...
@NotEmpty
@NotNull
private Map<String, String> headers;
}
Когда я пытаюсь ввести в некоторые @Autowired
тесты без @Validated
в первом классе это работает (fr
а также es
есть значения в файле yml)
Когда я добавляю @Validated, fr
а также es
являются нулевыми
Тестовое задание:
@RunWith(SpringRunner.class)
@SpringBootTest
public class AccertifyConfigurationTest {
@Autowired
private AccertifyConnectionDetail accertifyConnectionDetail; // <--- this field should be injected
@Test
public void givenAAccertifyClientService_WhenClientIsBuild_ShouldHaveTheProviderConfigurationCorrect() {
AccertifyConfiguration accertifyConfiguration = new AccertifyConfiguration(accertifyConnectionDetail);
accertifyConfiguration.buildConfiguration("FR", "Merchant1");
Assert.assertEquals("fraud", accertifyConfiguration.getUser());
Assert.assertEquals("temporal", accertifyConfiguration.getPassword());
Assert.assertTrue(accertifyConfiguration.getHost().startsWith("sandbox.accertify."));
Assert.assertEquals("merchant1FR", accertifyConfiguration.getMerchantCode());
}
...