[JAVA] Eine Geschichte, die mich bedauerte, als während der Entwicklung der Spring Boot-App eine "NotReadablePropertyException" auftrat.

Wie der Titel schon sagt, steckte ich in einem Fehler fest und es schien, als würde ich viele Male auf den Code zurückblicken. Ich habe es durch Versuch und Irrtum gelöst, aber ich konnte nichts dagegen tun, aber ich dachte, es könnte jemand anderes sein, also werde ich es als Memorandum belassen.

Fehlerinhalt

Konsole



2019-12-27 09:13:27.304 ERROR 21044 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/mainPage.html]")] with root cause

org.springframework.beans.NotReadablePropertyException: Invalid property 'foodsName' of bean class [com.PFCbalancer.model.FormFoodsData]: Bean property 'foodsName' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
	at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:622) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:612) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:104) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:228) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:129) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.engine.TemplateHandlerAdapterMarkupHandler.handleStandaloneElementEnd(TemplateHandlerAdapterMarkupHandler.java:260) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler$InlineMarkupAdapterPreProcessorHandler.handleStandaloneElementEnd(InlinedOutputExpressionMarkupHandler.java:256) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.standard.inline.OutputExpressionInlinePreProcessorHandler.handleStandaloneElementEnd(OutputExpressionInlinePreProcessorHandler.java:169) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.templateparser.markup.InlinedOutputExpressionMarkupHandler.handleStandaloneElementEnd(InlinedOutputExpressionMarkupHandler.java:104) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.attoparser.HtmlVoidElement.handleOpenElementEnd(HtmlVoidElement.java:92) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.attoparser.HtmlMarkupHandler.handleOpenElementEnd(HtmlMarkupHandler.java:297) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.attoparser.MarkupEventProcessorHandler.handleOpenElementEnd(MarkupEventProcessorHandler.java:402) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.attoparser.ParsingElementMarkupUtil.parseOpenElement(ParsingElementMarkupUtil.java:159) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.attoparser.MarkupParser.parseBuffer(MarkupParser.java:710) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:301) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.attoparser.MarkupParser.parse(MarkupParser.java:257) ~[attoparser-2.0.5.RELEASE.jar:2.0.5.RELEASE]
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_162]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_162]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]


Alle oben genannten Fehleranweisungen. Der Kernfehler dabei ist ** 2. Zeile **.

Does the return type of the getter match the parameter type of the setter?

Übrigens heißt es übersetzt: "Der Rückgabewert des Getters stimmt nicht mit dem Typ des Setters überein."

Jetzt, wo ich es verstehe, frage ich mich, ob ich mir den Code ansehen werde.

Entsprechender Code

view(Auszug)



<form method="post" th:action="@{/main/calcNowPFC}" th:object="${formFoodsData}">
	<div class="bottomForm__inputArea">
		<div>
			<label class="bottomForm__inputArea--label">Produktname:</label>
			<input class="bottomForm__inputArea--textbox" type="text" th:field="*{foodsName}">
			<label class="bottomForm__inputArea--label">P:</label>
			<input class="bottomForm__inputArea--numberbox" type="number" th:field="*{foodsProtein}">
			<label class="bottomForm__inputArea--label">F:</label>
			<input class="bottomForm__inputArea--numberbox" type="number" th:field="*{foodsFat}">
			<label class="bottomForm__inputArea--label">C:</label>
			<input class="bottomForm__inputArea--numberbox" type="number" th:field="*{foodsCarb}">
		</div>
		<div class="bottomForm__inputArea--btn">
			<button type="submit" class="bottomForm__inputArea--btnSubmit">add</button>
		</div>
	</div>
</form>


Diesmal ** habe ich einen Fehler erhalten, sobald ich das oben Gesagte eingegeben habe. ** ** ** Ich habe auch die folgenden Controller überprüft, z. B. die Methode, die Aktion und die Bindungsspezifikationsmethode (th: object, th: field) des Formulars.

controller(Auszug)



@PostMapping("/main/calcNowPFC")
	public String postMainNowPFC(@ModelAttribute FormBodyData formBodyData, FormFoodsData formFoodsData, BindingResult bindingResult, Model model) {

	foodsList.add(formFoodsData);
	model.addAttribute("foodsList",foodsList);

	model.addAttribute("label",label);
    model.addAttribute("protein",protein);
    model.addAttribute("fat",fat);
    model.addAttribute("carb",carb);
    model.addAttribute("kal",kal);

    model.addAttribute("foodsProtein",foodsProtein);
    model.addAttribute("foodsFat",foodsFat);
    model.addAttribute("foodsCarb",foodsCarb);

		return "mainPage";
}

Dies ist die Beschreibung auf der Controllerseite

Nach der Annotation @ModelAttribute gibt ** FormFoodsData formFoodsData die Klasse für die Bindung an **, und es wird beurteilt, dass das Modellmodell das Attribut ** als Argument hat. ** ** **

BindingResult Überprüfen Sie, ob Sie das Ergebnis von ** bind mit bindingResult erhalten können. ** ** **

Zu diesem Zeitpunkt schien die Controllerseite in Ordnung zu sein.

model(Zum Binden)



package com.PFCbalancer.model;

import lombok.Data;

@Data
public class FormFoodsData {
	private String foodsName;
	private int foodsProtein;
	private int foodsFat;
	private int foodsCarb;
}

Dies ist ein praktisches Plug-In, das im Modell automatisch einen Getter und Setter namens Lombok generiert. Der betreffende Getter und Setter werden nicht beschrieben.

Überprüfen Sie vorerst, ob der für das Objekt th: auf der Ansichtsseite angegebene Klassenname korrekt ist. Es ist th: object = "$ {formFoodsData}" und es scheint, dass das ** erste Großbuchstaben des Variablennamens automatisch konvertiert wird **, also ** überprüfen Sie die Übereinstimmung mit dem Klassennamen **, damit es kein Problem gibt.

Überprüfen Sie th: field = "* {FoodsName}" und 3 weitere Felder. Dies ist kein Problem, da der Argumentname des Modells ** genau übereinstimmt. ** ** **

Als Ergebnis des Betrachtens des Codes ...

Beurteilt, dass es kein Problem in Bezug auf Code gibt. Dann was? Was bedeutet es überhaupt, dass "Getter- und Setter-Typen nicht übereinstimmen"? lombok ...!

Während ich nachforschte, dachte ich, dass ich Lombok wieder einfügen und das Projekt aktualisieren möchte. プロジェクト再起動.png

Ergebnis ... App gestartet: sob :: sob :: sob:

Zusammenfassung

Diesmal gab es kein Problem mit dem Code. Aber ich habe den Code gewaschen und überprüft ** Er wurde einen halben Tag lang zerkleinert. **: enttäuscht_relieved: Infolgedessen konnte der Code der Schwierigkeit entkommen, indem er ** das Plug-In neu installierte und das Projekt ** ohne Probleme aktualisierte **. : entspannt: Ich persönlich erkannte jedoch, dass es sich um eine sehr beunruhigende Entwicklung handelte oder dass eine solche Entwicklung stattfinden konnte, solange ich Ingenieur war. ** ** **

Was ich in diesem Fall vermitteln möchte und was ich in meinem Kopf eingraviert habe, ist nicht an die Dinge vor mir gebunden. Wird es sein? Ich dachte ** </ font>. Es ist lange her, aber ich möchte es zum letzten Wort machen.

: sunny: Hab ein gutes Ingenieurleben! : sonnig:

Recommended Posts

Eine Geschichte, die mich bedauerte, als während der Entwicklung der Spring Boot-App eine "NotReadablePropertyException" auftrat.
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Bei der Einführung von JOOQ in Spring Boot wurde eine Geschichte behandelt, die behandelt wurde, weil bei Liquidbase ein Fehler aufgetreten ist
[Spring Boot] Die Geschichte, dass die Bean der Klasse mit der Annotation ConfigurationProperties nicht gefunden wurde
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
Rufen Sie in Spring Boot eine Proxy-Instanz der Komponente selbst ab
Ein Memo, das die einfache Chat-Anwendung von Node.js + socket.io enthält
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
Spring Boot-Anwendungsentwicklung in Eclipse
Memorandum beim Spring Boot 1.5.10 → Spring Boot 2.0.0
Ein Memo, das Spring Boot berührte
Fälle, in denen Benutzer beim Bearbeiten einer App abgemeldet sind (Rails)
Erstellen Sie mit dem Befehl cURL + tar ein Spring Boot-App-Entwicklungsprojekt
Eine Geschichte über ein in Java geschriebenes Spring Boot-Projekt, das Kotlin unterstützt
Die Geschichte der Begegnung mit Spring Custom Annotation
Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Starten Sie die Entwicklung von Webanwendungen mit Spring Boot
Die Geschichte einer Android-Anwendung, mit der die Abtastfrequenz des Beschleunigungssensors angepasst werden kann
Melden Sie sich bei Spring Boot-Webanwendungen auf der Microsoft ID-Plattform an
Rufen Sie den in der Controller-Klasse von Spring Boot definierten Pfad als Liste ab
Eine Geschichte, die die Implementierung der SendGrid-Java-Bibliothek bestätigt, wenn die E-Mail-Zustellung fehlschlägt
Ressourcenhandler-Einstellungen bei der Bereitstellung von SPA mit der statischen Ressourcenfunktion von Spring Boot
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Geben Sie ein Beispiel für eine Leistungsverschlechterung an, die aufgetreten ist, als das Argument Comparator of Arrays.sort als Lambda-Ausdruck angegeben wurde
[Ein Muss für junge Ingenieure] Eine Geschichte, die die Welt erweitert hat, als ich tatsächlich einen Webdienst betrieben habe, den ich selbst erstellt habe
Eine Geschichte, dass eine Person, die ein solides iOS gemacht hat, möglicherweise von der Implementierung von Listener abhängig ist, wenn sie zu Android wechselt