gpt4 book ai didi

java - 在 Spring 中将带有嵌套对象列表的 JSON 传递到 Rest Controller 时出错

转载 作者:行者123 更新时间:2023-12-02 04:23:25 25 4
gpt4 key购买 nike

请我尝试将此 json 传递给 spring 框架中的 Controller 。

{
"date" : "2012-02-09",
"subject" : "Margin ",
"selections" : [
{"FGY" : ["Try", "Harder"]},{"LGY" : ["Harder", "Try"]}
]
}

选择类是

    import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.List;

@Component
public class Selections implements Serializable {

//@Bean
public Selections(){

}

@JsonProperty("FGY")
private List<String> FGY;

@JsonProperty("LGY")
private List<String> LGY;

public List<String> getFGY() {
return FGY;
}

public void setFGY(List<String> FGY) {
this.FGY = FGY;
}

public String getLGY(){
return LGY;
}

public void setLGY(List<String> LGY) {
this.LGY = LGY;
}
}

ReportRequest 类是:

   import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Component
public class ReportRequest implements Serializable{

private String report;
private Date date;
private List<Selections> selections;

public ReportRequest(){

}

public String getReport() {
return report;
}

public void setReport(String report) {
this.report = report;
}

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

public List<Selections> getSelections() {
return selections;
}

public void setSelections(List<Selections> selections) {
this.selections = selections;
}
public ReportResponse processRequest() {

for(Selections selection : getSelections()){ // null error occurs on either FGY or LGY depending on which is the second in the json list
selection.getFGY().forEach(System.out::println);
selection.getLGY().forEach(System.out::println);
}
return null;
}

Controller

@RequestMapping(value = "/request_report" , method = RequestMethod.POST )
public @ResponseBody
ReportResponse receive(@RequestBody ReportRequest reportRequest) {
return reportRequest.processRequest();
}

这是错误:java.lang.NullPointerException:null

进行调试后,我发现 ReportRequest processRequest 方法中发生了 null 错误。

旧错误(已解决):reportRequest 对象的其他属性已从 json 正确初始化,但属性“selections”无法使用 json 中的字符串列表初始化“FGY”对象

编辑(新错误):新错误是,只有json中选择列表中的第一个对象被传递到spring类ReportRequest中的选择列表中。列表中的第二个对象未传递。因此,空错误发生在 json 中的第二个位置。例如 LGY 目前排名第二。

堆栈跟踪:

`   
java.lang.NullPointerException: null
at com.teamapt.alm.utils.ReportRequest.processRequest(ReportRequest.java:79)
at com.teamapt.alm.controller.AlmController.receive(AlmController.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.teamapt.alm.config.Config$1.doFilter(Config.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

最佳答案

给出 getter/setter 组合

public List<String> getFGY() {
return FGY;
}

public void setFGY(List<String> FGY) {
this.FGY = FGY;
}

Jackson(我假设您用于 JSON 序列化/反序列化的名称)将确定属性的名称为 fgy,而不是 FGY。因此,反序列化将找不到您的属性(property)。

您可以使用其中之一来注释

@JsonProperty("FGY")

显式设置您期望的属性名称。

关于java - 在 Spring 中将带有嵌套对象列表的 JSON 传递到 Rest Controller 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32485312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com