Java 使用Jackson/Jersey将JSON映射到对象时出现NullPointerException
我有一个Glassfish服务器,用于Web服务。 我正在发送一个包含JSON的POST请求,并希望Jackson将其映射到JPA实体。 这就是NPE出现的时候 实体:Java 使用Jackson/Jersey将JSON映射到对象时出现NullPointerException,java,json,rest,jersey,jackson,Java,Json,Rest,Jersey,Jackson,我有一个Glassfish服务器,用于Web服务。 我正在发送一个包含JSON的POST请求,并希望Jackson将其映射到JPA实体。 这就是NPE出现的时候 实体: @Entity @XmlRootElement @Table(name = "tracks", schema = "public", catalog = "xtracker") public class Track { @Id @GeneratedValue(strategy = GenerationType.I
@Entity
@XmlRootElement
@Table(name = "tracks", schema = "public", catalog = "xtracker")
public class Track {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "track_id", nullable = false, insertable = true, updatable = true)
private Long trackId;
@Basic
@Column(name = "time_start", nullable = true, insertable = true, updatable = true)
private Timestamp timeStart;
@Basic
@Column(name = "time_end", nullable = true, insertable = true, updatable = true)
private Timestamp timeEnd;
@OneToMany(mappedBy = "track")
private List<Jump> jumps = new ArrayList<>();
@OneToMany(mappedBy = "track", cascade = CascadeType.PERSIST)
private List<Point> points = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
private User user;
...getters and setters
异常指向track.getTrackId
Jackson工作正常,因为当我尝试用一个字段映射简单的测试对象而没有多个字段关系时,这是正常的
应用程序配置:
@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
// following code can be used to customize Jersey 2.0 JSON provider:
try {
Class jsonProvider = Class.forName("org.glassfish.jersey.jackson.JacksonFeature");
// Class jsonProvider = Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature");
// Class jsonProvider = Class.forName("org.glassfish.jersey.jettison.JettisonFeature");
resources.add(jsonProvider);
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
resources.add(SecurityFilter.class);
addRestResourceClasses(resources);
return resources;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically re-generated by NetBeans REST support to populate
* given list with all resources defined in the project.
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(RestResource.class);
}
}
更新:
这是一个来自客户端的JSON示例,我检查了它是否真的到达了Jersey:
{跳跃:[],点:[{pointId:0,速度:0.2}]}
pointId和速度是点字段
更新2:
问题解决了:是RequestFilter清除了一个http实体体,空实体到达了方法。谢谢 在您的示例中是track null还是trackId null?在Jackson生成的NPE警告之前是否打印出任何错误或警告,这些错误或警告可能会带来更清晰的信息?OMG感谢您更新2!我一直在为这件事发愁:
@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
// following code can be used to customize Jersey 2.0 JSON provider:
try {
Class jsonProvider = Class.forName("org.glassfish.jersey.jackson.JacksonFeature");
// Class jsonProvider = Class.forName("org.glassfish.jersey.moxy.json.MoxyJsonFeature");
// Class jsonProvider = Class.forName("org.glassfish.jersey.jettison.JettisonFeature");
resources.add(jsonProvider);
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
resources.add(SecurityFilter.class);
addRestResourceClasses(resources);
return resources;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically re-generated by NetBeans REST support to populate
* given list with all resources defined in the project.
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(RestResource.class);
}
}