Как мне исправить ошибку: не удалось преобразовать значение типа ‘java.lang.Строка’ в требуемый тип ‘java.lang.Длинный’;

#java #spring #spring-boot #spring-data-jpa #thymeleaf

#java #spring #spring-boot #spring-data-jpa #thymeleaf

Вопрос:

Я работаю над веб-приложением Project manager, которое позволяет вам входить в систему как участник и присоединяться к различным проектам. Участники могут принимать участие в нескольких проектах. Объекты Project и Member связаны с помощью объекта Membership. Каждый раз, когда зарегистрированный участник присоединяется к проекту, создается новый объект членства.

Однако у меня возникают проблемы с созданием нового членства после того, как участник нажимает кнопку присоединиться на joinProject.html -страница. Я продолжаю получать следующее сообщение об ошибке:

 (type=Bad Request, status=400).
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "saveMembership"
 

Цель состоит в том, чтобы добавить зарегистрированного участника в проект. Новое членство можно увидеть в списке projectDetails.html -страница.

Я использую Spring Boot, Thymeleaf и JPA. У меня такое чувство, что это что-то действительно простое и глупое, но я просто не могу найти проблему. 🙁

Если вам нужно увидеть больше кода или информации, я буду рад предоставить.

Спасибо за ваше время!

Вот MembershipCreatorObject-класс, который я пытаюсь использовать для получения необходимых данных в моем контроллере:

 public class MembershipCreatorObject {

    private String id;
    private String username;
    private String jobDescription;

    public MembershipCreatorObject() {
        super();
    }

    public MembershipCreatorObject(String id, String username, String jobDescription) {
        super();
        this.id = id;
        this.username = username;
        this.jobDescription = jobDescription;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getJobDescription() {
        return jobDescription;
    }

    public void setJobDescription(String jobDescription) {
        this.jobDescription = jobDescription;
    }
 

Вот мой контроллер:

 
    @RequestMapping(value= {"/joinProject/{projectId}"})
    public String joinProject(@PathVariable("projectId") Long urlId, Model model) {

        model.addAttribute("mObject", new MembershipCreatorObject());

        model.addAttribute("project", projectRepo.findByProjectId(urlId));

        return "joinProject";
    }

    @RequestMapping(value="/saveMembership", method=RequestMethod.POST)
    public String saveMembership(MembershipCreatorObject mObject) {

        String id = mObject.getId();

        Long idConverted = Long.parseLong(id);

        String username = mObject.getUsername();

        String description = mObject.getJobDescription();

        Project projectToAdd = projectRepo.findByProjectId(idConverted);

        Member memberToAdd = memberRepo.findByUsername(username);

        Membership membershipToAdd = new Membership(description, memberToAdd, projectToAdd);

        membershipRepo.save(membershipToAdd);

        return "redirect:/projectCatalog";
    }
 

Вот файл joinProject -html.

     <h1>Join Project</h1>

    <h4 th:inline="text">Logged in as: [[${#httpServletRequest.remoteUser}]]</h4>

    <form th:object="${mObject}" th:action="@{saveMembership}" action="#" style="padding: 20px;" method="POST">

        <input th:field="*{id}" />
        <!-- th:value="${project.projectId}" -->

        <input type="text" th:field="*{username}" />
        <!-- th:value="${#httpServletRequest.remoteUser}" -->

        <label>What will you be working on?</label>
        <input type="text" th:field="*{jobDescription}" style="display: block;" />

        <input type="submit" value="Join" style="display: block; margin-top:10px; width:70px;">

    </form>
 

Ответ №1:

Похоже, вы пытаетесь преобразовать буквальную строку «saveMembership» в long, а не в строковое представление long, например:

 String str = "12323445664546544564974";
Long lng = Long.parseLong(str);
 

Это мое предположение, основанное на трассировке стека исключений, в котором указано «NumberFormatException: для входной строки: «savememembership»»

Ответ №2:

Я не эксперт по html или thymeleaf, но я думаю, что вы что-то неправильно ввели в свой html. Я считаю, что при включении submit ваш код отправляет POST запрос на /joinProject/saveMembership вместо /saveMembership . Вы можете легко протестировать в браузере (проверьте, какой URL-адрес запроса POST)