CascadeType 导致的 MessageBodyWriter 错误
MessageBodyWriter error caused by CascadeType
在两个系统中有一个网络服务运行:
- Windows 7 x64,Apache Tomcat/8.5.16,JVM 1.8.0_65-b17
- Ubuntu 16.04.2 LTS,Apache Tomcat/8.5.15,JVM 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11
网络服务看起来像:
public class Order implements Serializable {
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH}, mappedBy = "orderId")
private List<Item> itemList;
// getters and setters
}
...
public class Item implements Serializable {
@JoinColumn(name = "order_id", referencedColumnName = "id")
@ManyToOne(optional = false)
@XmlJavaTypeAdapter(OrderAdapter.class)
private Order orderId;
// getters and setters
}
...
@GET
@Produces({"application/xml", "application/json"})
public List<Order> findAll(@HeaderParam("authorization") String authString) throws Exception {
Query q = em.createNativeQuery("SELECT * FROM order", Order.class);
return q.getResultList();
}
问题:网络服务在第一台服务器上运行正常,没有错误。在第二台服务器中我得到了错误:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:
MessageBodyWriter not found for media type=application/xml, type=class
java.util.Vector, genericType=java.util.List
如果我更改以下行,Web 服务仅在第二台服务器上工作:
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH}, mappedBy = "orderId")
收件人:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "orderId")
那么,为什么同一个 web 服务在第一台服务器上运行正常,而在第二台服务器上却出错? MessageBodyWriter和CascadeType有什么关系?
遇到缓存问题后,我意识到项目中有 2 个持久性库:
- 坚持-api-1.0.jar
- javax.persistence_2.1.0.v201304241213.jar
所以我猜它在一台服务器上工作是因为加载顺序。删除第一个已解决的问题。
在两个系统中有一个网络服务运行:
- Windows 7 x64,Apache Tomcat/8.5.16,JVM 1.8.0_65-b17
- Ubuntu 16.04.2 LTS,Apache Tomcat/8.5.15,JVM 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11
网络服务看起来像:
public class Order implements Serializable {
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH}, mappedBy = "orderId")
private List<Item> itemList;
// getters and setters
}
...
public class Item implements Serializable {
@JoinColumn(name = "order_id", referencedColumnName = "id")
@ManyToOne(optional = false)
@XmlJavaTypeAdapter(OrderAdapter.class)
private Order orderId;
// getters and setters
}
...
@GET
@Produces({"application/xml", "application/json"})
public List<Order> findAll(@HeaderParam("authorization") String authString) throws Exception {
Query q = em.createNativeQuery("SELECT * FROM order", Order.class);
return q.getResultList();
}
问题:网络服务在第一台服务器上运行正常,没有错误。在第二台服务器中我得到了错误:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/xml, type=class java.util.Vector, genericType=java.util.List
如果我更改以下行,Web 服务仅在第二台服务器上工作:
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH}, mappedBy = "orderId")
收件人:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "orderId")
那么,为什么同一个 web 服务在第一台服务器上运行正常,而在第二台服务器上却出错? MessageBodyWriter和CascadeType有什么关系?
遇到缓存问题后,我意识到项目中有 2 个持久性库:
- 坚持-api-1.0.jar
- javax.persistence_2.1.0.v201304241213.jar
所以我猜它在一台服务器上工作是因为加载顺序。删除第一个已解决的问题。