Не удалось преобразовать значение свойства типа «java.lang.String» в требуемый тип «java.util.Date» для свойства «date»: длина не равна 10 символов - PullRequest
0 голосов
/ 30 октября 2019

в моем коде у меня есть две сущности BusDetails и User. Пользователь и BusDetails имеют много ко многим отношениям. Всякий раз, когда я пытаюсь забронировать автобус, данные сохраняются в таблице соединений в базе данных, но я получаю это исключение: Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'java.util.Date' для свойства 'date';вложенное исключение - java.lang.IllegalArgumentException: не удалось проанализировать дату: длина ее не точно 10 символов]]

Таблица пользователей:

public class User {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int u_id;

    @Column
    @NotEmpty(message = "Name cannot be empty")
    private String name;

    @Column
    @NotEmpty(message = "Username cannot be empty")
    private String userName;

    @Column
    @NotEmpty(message = "please enter number")
    @Size(min = 10,max = 10, message = "10 digits required")
    private String number;

    @Column
    @NotEmpty
    @Size(min=8,message = "Minimum 8 characters required")
    private String password;

    @ManyToMany(cascade = CascadeType.MERGE,fetch = FetchType.EAGER)
    @JoinTable(name = "user_role",joinColumns = @JoinColumn(name = "u_id"), inverseJoinColumns = @JoinColumn(name = "r_id"))
    public Set<Role> roles;


    @ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.EAGER)
    @JoinTable(name = "user_busdetails", joinColumns = @JoinColumn(name = "u_id") , inverseJoinColumns = @JoinColumn(name = "bus_Id"))
    public Set<BusDetails> bus = new HashSet<BusDetails>();


    //gettersAndSetters

BusDetails:

@Entity
@Component("BusDetails")
public class BusDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int bus_Id;


    @Column
    public String fromDestination;

    @Column
    public String toDestination;

    @Column
    @DateTimeFormat
    @Temporal(TemporalType.DATE)
    private Date date;

    @Column
    private String travels;

    @Column
    private String bus_Type;

    @Column
    private String seats_Available;

    @Column
    public String fare;

    @Column
    private String departure;

    @ManyToMany(fetch = FetchType.EAGER,mappedBy = "bus")
    @JsonIgnore
    public Set<User> user = new HashSet<User>();

    //gettersAndSetters

BookController:

@PostMapping("/bookbus")
    @ResponseBody
    public BusDetails bookBus(@ModelAttribute BusDetails bus) {



        System.out.println(bus.getDate());
        return busDetail.bookBus(bus);

    }
    @InitBinder     
    public void initBinder(WebDataBinder binder){
         binder.registerCustomEditor(       Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy- 
    MM-dd"), true, 10));   
    }

BookService:

public BusDetails bookBus(BusDetails bus) {


        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        String currentPrincipleName = authentication.getName();



        User user = userRepo.findByUserName(currentPrincipleName);


        user.getBus().add(bus);
        System.out.println(user);
        System.out.println(bus);


        userRepo.save(user);



        return bus;


    }

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Поскольку вы использовали @ModelAttribute в контроллере, это означает, что все параметры передаются в строковом формате.

В вашем случае это формат от String до Date.

@Entity
@Component("BusDetails")
public class BusDetails {

    //...

    @Column
    private Date date;

    //setter(can add or modify) should be custom like below :
    public void setDate(String date){
        try {
            this.date = new SimpleDateFormat("yyyy-MM-dd").parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    // ...getter & setter
}
0 голосов
/ 30 октября 2019

Преобразование параметров даты на уровне приложения

@Configuration
class DateTimeConfig {
    @Bean
    public FormattingConversionService conversionService() {
        DefaultFormattingConversionService conversionService = 
          new DefaultFormattingConversionService(false);

        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
        registrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
        registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
        registrar.registerFormatters(conversionService);

        // other desired formatters

        return conversionService;
    }
}

Сначала мы создаем DefaultFormattingConversionService с ложным параметром, что означает, что Spring по умолчанию не будет регистрировать никакие средства форматирования.

Затем мы вручную регистрируем новые шаблоны для форматов даты и времени в объекте DateTimeFormatterRegistrar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...