У меня эта ошибка, и я не уверен, что еще нужно устранить. Я просто пытаюсь заставить пользователя щелкнуть кнопку «rsvp» и зарегистрировать его в базе данных вместе с идентификатором пользователя, который нажал кнопку. Каждый раз, когда я нажимаю на кнопку, я попадаю на url / event / null. Любая помощь будет принята с благодарностью!
Event.java:
@Entity
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "event_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private User user;
private String message;
@JoinTable(name = "rsvp_status", joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "event_id"))
private Boolean rsvp = false;
@CreationTimestamp
private Date createdAt;
public Event() {}
public Event(User user, String message, Boolean rsvp, Date createdAt) {
this.user = user;
this.message = message;
this.rsvp = rsvp;
this.createdAt = createdAt;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Boolean getRsvp() {
return rsvp;
}
public void setRsvp(Boolean rsvp) {
this.rsvp = rsvp;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
@Override
public String toString() {
return "Event [id = " + id + ", user = " + user + ", message = " + message + ", rsvp = " + rsvp + ", createdAt = "
+ createdAt + "]";
}
}
EventService:
@Service
public class EventService {
@Autowired
private EventRepository eventRepository;
@Autowired
UserService userService;
public Event findEventById(Long id) {
Optional<Event> optionalEvent = eventRepository.findById(id);
Event event = null;
if (optionalEvent.isPresent()) {
event = optionalEvent.get();
return event;
} else {
return event;
}
}
public List<EventDisplay> findAll() {
List<Event> events = eventRepository.findAllByOrderByCreatedAtDesc();
return formatEvents(events);
}
public List<EventDisplay> findAllByUser(User user) {
List<Event> events = eventRepository.findAllByUserOrderByCreatedAtDesc(user);
return formatEvents(events);
}
public List<EventDisplay> findAllByUsers(List<User> users){
List<Event> events = eventRepository.findAllByUserInOrderByCreatedAtDesc(users);
return formatEvents(events);
}
public void save (Event event) {
eventRepository.save(event);
}
private List<EventDisplay> formatEvents(List<Event> events) {
List<EventDisplay> displayEvents = formatTimestamps(events);
return displayEvents;
}
private List<EventDisplay> formatTimestamps(List<Event> events) {
List<EventDisplay> response = new ArrayList<>();
PrettyTime prettyTime = new PrettyTime();
SimpleDateFormat simpleDate = new SimpleDateFormat("M/d/yy");
Date now = new Date();
for (Event event : events) {
EventDisplay eventDisplay = new EventDisplay();
eventDisplay.setUser(event.getUser());
eventDisplay.setMessage(event.getMessage());
long diffInMillies = Math.abs(now.getTime() - event.getCreatedAt().getTime());
long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);
if (diff > 3) {
eventDisplay.setDate(simpleDate.format(event.getCreatedAt()));
} else {
eventDisplay.setDate(prettyTime.format(event.getCreatedAt()));
}
response.add(eventDisplay);
}
return response;
}
Контроллер RSVP:
@Controller
public class RsvpController {
@Autowired
private UserService userService;
@Autowired
EventService eventService;
@PostMapping(value = "/event/{id}")
public String rsvp(@PathVariable Long id, @RequestParam String submit, Event event, HttpServletRequest request,
Model model) {
//getting the event by Id
Event eventToRsvp = eventService.findEventById(id);
if (submit.equals("up")) {
if (eventToRsvp != null) {
event.setRsvp(true);
eventService.save(event);
}
}
return "redirect:" + request.getHeader("Referer");
}
}
Events.html:
<form th:action = "@{/event/} + ${eventToRsvp}" method = "post">
<button style = "float: right;" type = "Submit" value = "up"
class = "btn btn-lg btn-primary">RSVP</button>
</form>
Ошибка в моем журнале консоли:
2021-03-29 18:08:21.511 WARN 17584 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "null"]
Не уверен, какая именно строка, но ошибка возникает, когда я нажимаю кнопку RSVP на моем интерфейсе.
Из-за ошибки похоже, что ваша переменная ${eventToRsvp} имеет значение null, и она отправляется контроллеру, где он пытается преобразовать строку 'null' в Long и, следовательно, терпит неудачу ... убедитесь, что вы отправляете правильное значение в ${eventToRsvp}




Похоже, ошибка может быть связана с вашим методом rsvp(). Для @PathVariable Long id ожидается тип Long, но вы передаете тип String. Вы можете сделать Long.parseLong(id), чтобы преобразовать String в Long. Также похоже, что вы передаете String представление "null" в этот id? Однако дайте мне знать, что вы получите после исправления первой ошибки.
Выполнение Long.parseLong (id) - дает мне ошибку. Вы имеете в виду, что я должен изменить тип возвращаемого значения метода? Мои извинения
Да, вы можете попробовать это.
Хорошо, я изменил тип возвращаемого значения на void, и он все еще дает мне ту же ошибку, поэтому он читает строку где-то внутри метода. Насколько я понимаю, когда у вас есть @PathVariable и аргумент рядом с ним, это то, что он читает в URL-пути, поэтому не уверен, почему он продолжает пытаться прочитать строку.
Вы изменили тип аргумента findEventById(Long id) на String id?
Только что сделал это, если бы я реализовал внутри репозитория метод для нового «String id». Теперь он дает мне Обязательный строковый параметр «submit» отсутствует. URL-адрес, когда я нажимаю кнопку, по-прежнему приводит меня к / events / null. Интересно лол
Не могли бы вы указать, на какой строке возникает эта ошибка?