CascadeType

时间:2017-07-11 20:37:25

标签: java web-services jaxb jersey tomcat8

在两个系统中运行了一个Web服务:

  1. Windows 7 x64,Apache Tomcat / 8.5.16,JVM 1.8.0_65-b17
  2. Ubuntu 16.04.2 LTS,Apache Tomcat / 8.5.15,JVM 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11
  3. 网络服务看起来像:

    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();
    
    }
    

    问题:webservice在第一台服务器上运行正常,没有错误。在第二台服务器中我得到了错误:

      

    org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:   找不到媒体类型= application / xml,type = class的MessageBodyWriter   java.util.Vector,genericType = java.util.List

    如果我更改了行,则webservice仅适用于第二台服务器:

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH}, mappedBy = "orderId")
    

    要:

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "orderId")
    

    那么,为什么同一个webservice在第一个服务器上运行正常并导致第二个错误?与MessageBodyWriter和CascadeType的关系是什么?

1 个答案:

答案 0 :(得分:0)

在遇到缓存问题后,我意识到项目中有2个持久性库:

  • persistence-api-1.0.jar
  • javax.persistence_2.1.0.v201304241213.jar

所以我猜它因为加载顺序而在一台服务器上运行。删除第一个已解决的问题。