ModelAttribute является нулевым после формы - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь сделать небольшой сайт по скалолазанию как личный проект, но я изо всех сил стараюсь придать ценность своему атрибуту модели.

    @RequestMapping("/new_topo")
    public String addTopo(Model model){
        Topo topo = new Topo();
        Sector sector = new Sector();

        model.addAttribute("topo", topo);
        model.addAttribute("sector", sector);
        return "new_topo";
    } 

Как видите, я добавляю в модель 1 экземпляр Topo. и Сектор, где данные будут получены здесь:


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Add a Spot</title>
</head>
<body>
<div th:replace="fragment/header :: header"> </div>
<h1 align="center">Add a topo</h1>
<form action="#" th:action="@{/save_topo}" method="post">
    <table align="center">
        <tr>
            <td>cotation</td>
            <td> <input type="text" th:field ="${topo.cotation}"> </td>
        </tr>
        <tr>
            <td>sector</td>
            <td> <input type="text" th:value ="${sector.name}"> </td>
        </tr>
        <tr>
            <td>spits_amount</td>
            <td> <input type="number" th:field ="${topo.spitAmount}"> </td>
        </tr>
        <tr>
            <td colspan="2"><button type="submit">Save</button> </td>
        </tr>
    </table>
</form>
</body>
</html>

проблема в том, что когда я пытаюсь получить доступ к полю сектора, он говорит, что "Сектор нулевой", в то время как поля топо принимаются совершенно нормально. Вот как я проверяю полученные данные:

    @RequestMapping(value = "/save_topo", method = RequestMethod.POST)
    public String saveTopo(@ModelAttribute("topo") Topo topo, @ModelAttribute("sector") Sector sector){
        System.out.println("============================");
        System.out.println(topo.getCotation() + " " + topo.getSpitAmount()); // Data 100% received
        System.out.println("============================");
        System.out.println("NAME IS EQUALS TO : " + sector.getName()); // null, did not receive the input from the form
        topo.getSector().add(sector);
        sector.setTopo(topo);
        topoService.save(topo);
        sService.save(sector);
        return "topos";
    }

обратите внимание, что я совершенно новичок в веб-сообществе и бэкэнд-сообществе и что я могу не знать 100% о том, как все работает (что, я думаю, будет очевидно для вас).

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Это может помочь?

Это приложение не имеет явного сопоставления для / error, поэтому Вы видите это как запасной вариант. Вт 17 марта 09:05:27 GMT 2020 Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). Нет доступных сообщений java .lang.NullPointerException в com.lufen.Project6.lade.Controller.TopoController.saveTopo (TopoController. java: 45) в java .base / jdk.internal.reflect.NativeMethodAccessorImpl. Собственный метод) в java .base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl. java: 62) в java .base / jdk.internal.reflect.DelegatingMethodAccessorImpor. : 43) в java .base / java .lang.reflect.Method.invoke (Метод. java: 566) в org.springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod. * 10) : 190) в org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest (InvocableHandlerMethod. java: 138) в org.springframework.web.servlet. * 1031 1032 *: 106) в org.springframework.web.servlet. mvc .method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod (Запрос MappingHandlerAdapter. java: 879) в org.springframework.web.servlet. mvc .method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter. java: 793) в org.springframework.we. методом. java: 943) в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet. java: 1006) в org.springframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet. javaax9: 90): 90 .servlet.http.HttpServlet.service (HttpServlet. java: 660) в org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet. java: 883) в javax.servlet.http.HttpServServ. . java: 741) в орг. apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 231) в орг. apache .catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain. java: 166) в орг. . apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 193) в орг. .web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy. java: 320) в org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor. java: работа в течение года или более). .access.intercept.FilterSecurityInterceptor. , ExceptionTranslationFilter. SessionManagementFilter. java: 137) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy. java: 334) в org.springframework.security.web.authentication. ** в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy. java: 334) в org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter (RequestCac heAwareFilter. java: 63) по адресу org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy. java: 334) по адресу org.springframework.security.web.authentication.ui.DefaultilogFot java: 52. по адресу org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter (DefaultLoginPageGeneratingFilter. java: 216) по адресу org.springframework.security.web.FilterChainProxy $ VirtualFililg:. .springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter (AbstractAuthenticationProcessingFilter. java: 200) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilxy (33. Filter): 33. 4) в org.springframework.security.web.authentication.logout.LogoutFilter.doFilter (LogoutFilter. java: 116) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy): 334 (фильтр) 1078). по адресу org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter (HeaderWriterFilter. java: 92) по адресу org.springframework.security.web.header.HeaderWriterFilter.doFilterIndoter: 77 .web.filter.OncePerRequestFilter. .SecurityContextPersistenceFilter.doFilter (SecurityContextPersistenceFilter. java: 105) в org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy. java: 334) на веб-сайте org.sync. c .WebAsyncManagerIntegrationFilter.doFilterInternal (WebAS yncManagerIntegrationFilter. java: 56) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter. java: 119) в org.springframework.security.web *. 334) по адресу org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy. java: 215) по адресу org.springframework.security.web.FilterChainProxy.doFilter (FilterChainProxy. javag.wef). .filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy. java: 358) в org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy. java: 271) в org. * 1093F. (ApplicationFilterChain. java: 193) в орг. apache .catalina.core.ApplicationFilterChain. doFilter (ApplicationFilterChain. java: 166) по адресу org.springframework.web.filter.RequestContextFilter.doFilterInternal (RequestContextFilter. java: 100) по адресу org.springframework.web.filter *OncePerReerilFid (Once): OnceF: 119) в орг. apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 193) в орг. apache .catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain. java 166): 16 .springframework.web.filter.FormContentFilter.doFilterInternal (FormContentFilter. java: 93) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter. java: 119.cat. * 1105 .cat) или в любом другом месте. .ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 193) на орг. .WebMvcMetricsFilter.doFilterInternal (WebMvcMetricsFilter. java: 109) в org.springframework.web.filter.Once PerRequestFilter.doFilter (OncePerRequestFilter. java: 119) в орг. apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 193) в орг. apache .catalina.FilCare. ApplicationFilterChain. java: 166) в org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter. java: 201) в org.springframework.web.filter.OncePerRequestFilter OnceReterFilter. в орг. apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 193) в орг. apache .catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain * java: 166) на 166) 1121 * .catalina.core.StandardWrapperValve.invoke (StandardWrapperValve. java: 202) в org. apache .catalina.core.StandardContextValve.invoke (StandardContextValve. java: 96) в org. * 1125. .authenticator.AuthenticatorBase.invoke (AuthenticatorBase. java: 541) в орг. apache .catalina.core.StandardHostValve.invoke (StandardHostVal ve. java: 139) в орг. apache .catalina.valves.ErrorReportValve.invoke (ErrorReportValve. java: 92) в орг. apache .catalina.core.StandardEngineValve.invoke (StandardEngineValve. * 1132) *: 74) в орг. apache .catalina.connector.CoyoteAdapter.service (CoyoteAdapter. java: 343) в орг. apache .coyote.http11.Http11Processor.service (Http11Processor. java: 367) в орг. apache .coyote.AbstractProcessorLight.process (AbstractProcessorLight. java: 65) в орг. apache .coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol. java: 868) в орг. apache .tomcat.util. net .NioEndpoint $ SocketProcessor.doRun (NioEndpoint. java: 1639) в org. apache .tomcat.util. net .SocketProcessorBase.run (SocketProcessorBase. java: 49) в java .base / java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1128) в java .base / java .util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 628) в орг. apache .tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread. java: 61) в java .b ase / java .lang.Thread.run (Тема. java: 834)

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Единственное отличие, которое я вижу между тем, которое работает, а что нет, - это поле атрибута и значение.

Изменить

th:value ="${sector.name}"

На

th:field ="${sector.name}"
0 голосов
/ 16 марта 2020

Пожалуйста, попробуйте это (обратите внимание на атрибут name, который должен совпадать с именами полей компонента):

 <input type="text" th:value="${sector.name}" name="name"> 

Если это не работает, измените остальные так же:

 <input type="text" th:value="${topo.cotation}" name="cotation"> </td>

 <input type="number" th:value="${topo.spitAmount}" name="spitAmount"> </td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...