org.springframework.beans.NotReadablePropertyException: - выпадающая форма - PullRequest
0 голосов
/ 09 ноября 2018

Я смотрел на другие темы, связанные с этой ошибкой, и не могу понять, почему я все еще сталкиваюсь с этой проблемой. Я считаю, что проблема связана с моим HTML-шаблоном. Я пытаюсь создать простой выпадающий список, чтобы выбрать список «тренировок» для удаления.

HTML-форма:

    <form action="#" th:action="@{/workout/deleteWorkout}" th:object="${workout}" method="post">
        <select th:field="*{workout}" name="workout" class="selectForm">
            <option th:each="workout : ${workouts}"
                    th:value="${workout.workoutID}"
                    th:text="${workout.workoutName}">
            </option>
        </select>
        <input type="submit" class="input-box">
    </form>

Методы контроллера для страницы:

    @GetMapping("/workout/deleteWorkout")
public String deleteWorkoutForm(Model model,
                                HttpServletRequest request) {
    Account account = (Account) request.getSession().getAttribute("loggedInUser");
    model.addAttribute("workouts", workoutService.getWorkouts(account));
    return "deleteWorkout";
}

@PostMapping("/workout/deleteWorkout")
public String deleteWorkout(@ModelAttribute Workout workout){
    workoutService.deleteWorkout(workout);
    return "workoutDeleted";
}

Ошибка:

org.springframework.beans.NotReadablePropertyException: Invalid property 'workout' of bean class [depaul.tables.Workout]: Bean property 'workout' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

Любая помощь приветствуется. Я особенно запутался, потому что в другом методе у меня не было проблем с получением выпадающего списка для выбора функции тренировки. Спасибо!

редактировать: Тренировка:

@Entity
 public class Workout implements Serializable, IWorkout {

public Workout(){
}

public Workout(String accountName, String workoutName, String description, String workoutDate){
    this.accountName = accountName;
    this.workoutName = workoutName;
    this.description = description;
    this.workoutDate = workoutDate;
}

private String accountName;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long workoutID;

@NotNull
private String workoutName;

private String description;

private String workoutDate;

@OneToMany(cascade = CascadeType.ALL,
        fetch = FetchType.EAGER,
        mappedBy = "workout")
@Nullable
private Collection<Exercise> exercises = new ArrayList<Exercise>();

public String getAccountName() {
    return accountName;
}

public void setAccountName(String accountName) {
    this.accountName = accountName;
}

@Override
public Long getWorkoutID() {
    return workoutID;
}

@Override
public void setWorkoutID(Long workoutID) {
    this.workoutID = workoutID;
}

@Override
public String getWorkoutName() {
    return this.workoutName;
}

@Override
public void setWorkoutName(String workoutName) {
    this.workoutName = workoutName;
}

@Override
public String getDescription() {
    return description;
}

@Override
public void setDescription(String description) {
    this.description = description;
}

@Override
public String getWorkoutDate() {
   return this.workoutDate;
}

@Override
public void setWorkoutDate(String workoutDate) {
    this.workoutDate = workoutDate;
}

@Override
public Collection<Exercise> getExercises() {
    return exercises;
}

@Override
public void setExercises(Collection<Exercise> exercises) {
    this.exercises = exercises;
}

1 Ответ

0 голосов
/ 09 ноября 2018

Я думаю, что происходит то, что тимелист пытается связать выделение select th:field="*{workout}" name="workout" class="selectForm">, которое называется "тренировка", со свойством public class Workout, которое не является частью этого класса.

Поскольку фактическим значением, которое вы хотите установить, является workoutID, я бы назвал мое поле

<select th:field="*{workoutID}" name="workout" class="selectForm">

поэтому тимелист связывает параметр с setWorkoutID(). вместо поиска setWorkout() свойства, которое не существует.

Надеюсь, это поможет!

Редактировать 1:

Поскольку в контроллере ожидается ожидаемый атрибут @ModelAttribute с именем 'workout' типа Workout.class, при отображении страницы механизм сервлета ищет этот объект, чтобы связать его с запросом. Поэтому вам нужно добавить эту строку в метод deleteWorkoutForm():

model.addAttribute("workout", new Workout());

Это инициализирует и привязывает объект к модели в RequestContext.

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