将数据发送到视图时出现 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 包含的内容。似乎您有一个名为validBinderResponse 字段,即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 尝试从一个名为 getterisValid(这是一个传统的 bean 属性名称)序列化一个名为 valid 的字段。然而,无论出于何种原因,getter 方法似乎都会抛出 NullPointerException

如果你想让Jackson忽略它,你可以用@JsonIgnore注释getter或用@JsonIgnoreProperties注释你的类,并指定属性名称,即。 valid.

【讨论】:

【参考方案2】:

在我使用 @JsonIgnore 的情况下,异常已经消失,但问题是它无法再从 API Request 接收该值并且 Spring 忽略了它(显然是因为 @JsonIgnore)所以我调查了问题并发现问题出在gettersetter。 我有Integer 属性,而我的getterint。因此,当我将 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)

将数据从套接字从C ++服务器发送到Python客户端时出现问题

将 Postman 请求发送到 json 服务器时出现问题