Не удалось преобразовать значение типа java.lang.String в требуемый тип java.lang.Long вложенное исключение java.lang.NumberFormatException Для входной строки "null"

У меня эта ошибка, и я не уверен, что еще нужно устранить. Я просто пытаюсь заставить пользователя щелкнуть кнопку «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"]

Не могли бы вы указать, на какой строке возникает эта ошибка?

ObjectJosh 30.03.2021 01:35

Не уверен, какая именно строка, но ошибка возникает, когда я нажимаю кнопку RSVP на моем интерфейсе.

Jake Wilson 30.03.2021 01:39

Из-за ошибки похоже, что ваша переменная ${eventToRsvp} имеет значение null, и она отправляется контроллеру, где он пытается преобразовать строку 'null' в Long и, следовательно, терпит неудачу ... убедитесь, что вы отправляете правильное значение в ${eventToRsvp}

hiren 30.03.2021 08:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
60
1

Ответы 1

Похоже, ошибка может быть связана с вашим методом rsvp(). Для @PathVariable Long id ожидается тип Long, но вы передаете тип String. Вы можете сделать Long.parseLong(id), чтобы преобразовать String в Long. Также похоже, что вы передаете String представление "null" в этот id? Однако дайте мне знать, что вы получите после исправления первой ошибки.

Выполнение Long.parseLong (id) - дает мне ошибку. Вы имеете в виду, что я должен изменить тип возвращаемого значения метода? Мои извинения

Jake Wilson 30.03.2021 02:06

Да, вы можете попробовать это.

ObjectJosh 30.03.2021 02:07

Хорошо, я изменил тип возвращаемого значения на void, и он все еще дает мне ту же ошибку, поэтому он читает строку где-то внутри метода. Насколько я понимаю, когда у вас есть @PathVariable и аргумент рядом с ним, это то, что он читает в URL-пути, поэтому не уверен, почему он продолжает пытаться прочитать строку.

Jake Wilson 30.03.2021 02:15

Вы изменили тип аргумента findEventById(Long id) на String id?

ObjectJosh 30.03.2021 02:21

Только что сделал это, если бы я реализовал внутри репозитория метод для нового «String id». Теперь он дает мне Обязательный строковый параметр «submit» отсутствует. URL-адрес, когда я нажимаю кнопку, по-прежнему приводит меня к / events / null. Интересно лол

Jake Wilson 30.03.2021 02:31

Другие вопросы по теме