将数据发送到视图时出现 JsonMappingException
Posted
技术标签:
【中文标题】将数据发送到视图时出现 JsonMappingException【英文标题】:Getting JsonMappingException while sending data to view 【发布时间】:2014-05-16 05:15:04 【问题描述】:我正在尝试向我的网页显示数据库数据。
当 GET 请求到@RequestMapping(value = "/api/binder")
时,我做了以下代码。
但是当 get 请求来到这个方法时,它会获取数据(我在控制台上打印并且显示良好)但它没有映射到我的 Java Script Ajax 调用,它向我显示一个错误。
以下是我获取数据的代码:
@Autowired
IBinderViewRepository repository;
@RequestMapping(method= RequestMethod.GET)
public @ResponseBody
List<BinderResponse> getBinders()
List<BinderView> binders = repository.getBinders();
List<BinderResponse> responses = new ArrayList<>();
ModelMapper mapper = Mapper.getInstance();
for(int i = 0; i < binders.size(); i++)
System.out.println("In Loop");
BinderResponse response = mapper.map(binders.get(i),BinderResponse.class);
System.out.println("Data :: " + response.getBinderName());
responses.add(response);
return responses;
但它显示了以下错误:
HTTP Status 500 - Could not write JSON: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"])
这是来自淘汰赛 js 的 ajax 调用:
ajax.get('api/binder').done(function(response) ...
这里BinderView and BinderResponse
有相同的字段:
private String binderName;
private String binderAddress1;
和 getter setter 在两者中也是如此。
和repository.genBinders()
方法从数据库中获取数据。
这是插入方法,对我来说效果很好:
@RequestMapping(method= RequestMethod.POST,consumes = "application/json")
public @ResponseBody
IWebApiResponse addBinder(@RequestBody AddBinderForm binder)
.....
我必须输入任何json annotation on my BinderResponse class ?
我不明白我哪里错了?任何人请指导我。
更新:
public class BinderResponse extends WebApiResponseBase
private String binderName;
private String binderAddress1;
public String getBinderName()
return binderName;
public void setBinderName(String binderName)
this.binderName = binderName;
public String getBinderAddress1()
return binderAddress1;
public void setBinderAddress1(String binderAddress1)
this.binderAddress1 = binderAddress1;
活页夹视图:
public class BinderView extends BaseView
private String binderName;
private String binderAddress1;
public String getBinderName()
return binderName;
public void setBinderName(String binderName)
this.binderName = binderName;
public String getBinderAddress1()
return binderAddress1;
public void setBinderAddress1(String binderAddress1)
this.binderAddress1 = binderAddress1;
在控制台中打印数据/BinderName:
In Loop
Data :: ada
In Loop
Data :: tya
新更新:
这里是 BaseView:
@MappedSuperclass
public abstract class BaseView implements IEntity
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name="id")
private long id;
public long getId()
return id;
public void setId(long id)
if (this.id != 0 && this.id != id)
throw new IllegalStateException(
"The ID must not be changed after it is set.");
this.id = id;
在 IEntity 中:
public interface IEntity extends Serializable
long getId();
void setId(long id);
WebApiResponseBase:
public class WebApiResponseBase implements IWebApiResponse
private String _uri;
@Override
public String getUri()
return _uri == null ? "" : _uri;
@Override
public void setUri(String uri)
_uri = uri;
【问题讨论】:
查看您的responses
包含的内容。似乎您有一个名为valid
的BinderResponse
字段,即null
。那个字段是什么?
您在WebApiResponseBase.isValid
有一个NullPointerException
。你调查过吗?
是的,不仅如此,它还是一个有效的 bean 属性名称,因此 Jackson 将尝试为其创建一个 JSON 字段。这似乎是导致 NPE 的原因。
查看@JsonIgnoreProperties
注释。
我遇到了相反的情况,我的变量被定义为“双”,而 getter 和 setter 是“双”。将变量从“双”更改为“双”对我有用。
【参考方案1】:
默认情况下,Jackson 序列化对象的整个继承层次结构,即。父类字段也是如此。在
的情况下public class BinderResponse extends WebApiResponseBase
好像
Could not write JSON: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]->com.ngl.dto.outgoing.BinderResponse["valid"])
Jackson 尝试从一个名为 getter
的 isValid
(这是一个传统的 bean 属性名称)序列化一个名为 valid
的字段。然而,无论出于何种原因,getter 方法似乎都会抛出 NullPointerException
。
如果你想让Jackson忽略它,你可以用@JsonIgnore
注释getter或用@JsonIgnoreProperties
注释你的类,并指定属性名称,即。 valid
.
【讨论】:
【参考方案2】:在我使用 @JsonIgnore
的情况下,异常已经消失,但问题是它无法再从 API Request
接收该值并且 Spring 忽略了它(显然是因为 @JsonIgnore
)所以我调查了问题并发现问题出在getter
和setter
。
我有Integer
属性,而我的getter
是int
。因此,当我将 getter
更改为 Integer
时,我的问题解决了,错误消失了。
private Integer purchaseId;
@JsonIgnore
public int getPurchaseId()
return purchaseId;
public void setPurchaseId(int purchaseId)
this.purchaseId = purchaseId;
改为:
private Integer purchaseId;
public Integer getPurchaseId()
return purchaseId;
public void setPurchaseId(Integer purchaseId)
this.purchaseId = purchaseId;
【讨论】:
【参考方案3】: @Column(name="createddate")
private Date createdDate;
@Transient
private String formatedCreatedDate;
public String getFormatedCreatedDate()
DateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
return dateFormat.format(this.getCreatedDate());
它抛出相同的异常,因为这里可能通过调用 getCreatedDate() 值来为空,所以它不能格式化空日期,所以在这里保持空检查:
解决方案
public String getFormatedCreatedDate()
DateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
Date createDdate=this.getCreatedDate();
if(createDdate!=null)
return dateFormat.format(createDdate);
return "-";
【讨论】:
以上是关于将数据发送到视图时出现 JsonMappingException的主要内容,如果未能解决你的问题,请参考以下文章
使用javascript将数据发送到api时出现cors问题[重复]
将文件发送到 django 时出现 Keyerror/MultiValueDictKeyError
将 JSON 数据从 JQuery 发送到 WCF REST 方法时出现问题
ViewPager - 将数据从片段发送到活动时出现 Android 错误 setCurrentItem(int,boolean)