Spring data jdbc не работает с окончательными атрибутами - PullRequest
0 голосов
/ 30 апреля 2019

Я пробую данные пружины JDBC (1.1.0.M3). У меня есть класс Formateur (Teacher), который содержит атрибут электронной почты (класс Email). Электронная почта является неизменным классом. Когда я извлекаю всех учителей из базы данных, у меня появляется следующее

исключение: java.lang.UnsupportedOperationException: невозможно установить неизменное свойство fr.yestech.data.jdbc.domain.Email.email

Кажется, что данные JDBC о весне плохо работают с конечными атрибутами!

public class Formateur {

    private @Id Long id;
    private String nom;
    @Embedded
    private Email email;

...
}

Класс электронной почты (неизменный класс, поэтому нет сеттеров!)

public final class Email {

    private final String email;
    private static final Pattern EMAIL_PATTERN = Pattern.compile("^[_A-Za-z]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$");

    private Email(String email) {
      Objects.requireNonNull(email, "Adresse email doit être non null!");
        if (!EMAIL_PATTERN.matcher(email).matches())
          throw new IllegalArgumentException("L'adresse email est 
                     invalide !");
        this.email = email;
    }

    public static Email of(String email) {
        return new Email(email);
    }
...
}

Применение

@SpringBootApplication
public class SpringJdbcApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringJdbcApplication.class, args);
    }

    @Bean
    ApplicationRunner applicationRunner(FormateurRepository formateurRepository) {
        return args -> {
            Formateur teacher = Formateur.of("YesTech", Email.of("yestech@email.com"), Adresse.of("Goux"));

            formateurRepository.save(teacher); 
            formateurRepository.findAll().forEach(System.out::println);
        };
    }

}

1 Ответ

0 голосов
/ 07 мая 2019

Это действительно ошибка.Вы можете обойти эту проблему, добавив "вюжет"

private Email withEmail(String email) {
    return new withEmail(email);
}

Это может быть даже приватно.

Я создал проблему для этой , поэтому она будет исправлена ​​в ближайшее время.

...