【问题标题】:javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException - with linked exception:javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException - 带有链接异常:
【发布时间】:2014-10-23 12:02:00
【问题描述】:

我正在开发一个肥皂网络服务。我将 JPA 与 namedquery 注释一起用于数据查询。但是,在我的查询中将 sum 之类的聚合函数与 group by 结合使用会导致一些异常。我的代码如下所示。

@Entity
@Cacheable(false)
@Table(name = "criteriatable")
@XmlRootElement
@NamedQueries(
{
@NamedQuery(name = "Criteriatable.findAll", query = "SELECT c FROM Criteriatable c"),
@NamedQuery(name = "Criteriatable.findById", query = "SELECT c FROM Criteriatable c WHERE c.id =    :id"),
@NamedQuery(name = "Criteriatable.findByCriteriaid", query = "SELECT c FROM Criteriatable c WHERE c.criteriaid = :criteriaid"),
@NamedQuery(name = "Criteriatable.findBySubcriteriaid", query = "SELECT c FROM Criteriatable c WHERE c.subcriteriaid = :subcriteriaid"),
@NamedQuery(name = "Criteriatable.findByProjectid", query = "SELECT c FROM Criteriatable c WHERE c.projectid = :projectid"),
@NamedQuery(name = "Criteriatable.findAllCriteriatableGroup", query = "SELECT c.criteriagroupname AS groupname, SUM(c.weight) AS groupweight  FROM Criteriatable c WHERE c.projectid = :projectid GROUP BY c.criteriagroupname"),
@NamedQuery(name = "Criteriatable.SumAllWeightByProjectid", query = "SELECT SUM(c.weight) AS TotalProjectWeight FROM Criteriatable c WHERE c.projectid = :projectid")    
})
  public class Criteriatable implements Serializable
{
@Basic(optional = false)
@NotNull
@Column(name = "weight")
private double weight;
@Basic(optional = false)
@NotNull
@Column(name = "status")
private int status;
@Basic(optional = false)
@NotNull
@Lob
@Size(min = 1, max = 65535)
@Column(name = "criteriagroupname")

WS方法

@WebMethod(operationName = "getAllCriteriaGroupByProjectid")
public List<Criteriatable> getAllCriteriaGroupByProjectid(@WebParam(name = "projectid") int projectid)
{
    EntityManager em = emf.createEntityManager();
    String find = "Criteriatable.findAllCriteriatableGroup";
    TypedQuery<Criteriatable> query = em.createNamedQuery(find, Criteriatable.class);
    query.setParameter("projectid", projectid);
    return query.getResultList();
}

我收到的错误是:

SEVERE:   Error occured
javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: class [Ljava.lang.Object; nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class [Ljava.lang.Object; nor any of its super class is known to this context.]

我需要帮助。谢谢。

【问题讨论】:

    标签: java xml web-services jpa soap


    【解决方案1】:

    您的查询 Criteriatable.findAllCriteriatableGroup 未返回 Criteriatable 对象。

    它返回一个 [groupName, groupweight] 元组列表。

    请记住,泛型类型信息在运行时不可用,因此您在运行时的List&lt;Criteriatable&gt; 集合将是List&lt;Object[]&gt;(实际上是List&lt;Object[2]&gt;,但您不能那样写)。

    这随后会导致 JAXB 映射失败。

    你需要为你的结果定义一个 POJO:

    @XmlRootElement
    public class GroupTotal {
    
        private String groupName;
    
        private double groupTotal;
    
        public GroupTotal(String groupName, double groupTotal) {
             this.groupName = groupName;
             this.groupTotal = groupTotal;
        }
    
        // getters and setters ...
    }
    

    修改您的查询:

    SELECT NEW your.package.GroupTotal (c.criteriagroupname, SUM(c.weight))
      FROM Criteriatable c WHERE c.projectid = :projectid GROUP BY c.criteriagroupname
    

    最后执行:

    TypedQuery<GroupTotal> query = em.createNamedQuery(find, GroupTotal.class);
    

    我还没有尝试过,但它应该能让你指出正确的方向。

    【讨论】:

    • @Steve_C 你还能帮我吗,我仍然收到类似错误:异常描述:编译时遇到内部问题 [SELECT NEW GroupTotal (c.criteriagroupname, SUM(c.weight))FROM Criteriatable c WHERE c.projectid = :projectid GROUP BY c.criteriagroupname]。内部异常:java.lang.NullPointerException 严重:异常 [EclipseLink-28019](Eclipse 持久性服务 - 2.5.0.v20130507-3faac2b):org.eclipse.persistence.exceptions.EntityManagerSetupException 异常描述:PersistenceUnit [MamcaPU] 的部署失败。关闭此 PersistenceUnit 的所有工厂。
    • 内部异常:异常 [EclipseLink-0] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b):org.eclipse.persistence.exceptions.JPQLException 异常描述:编译时遇到内部问题 [SELECT新 GroupTotal (c.criteriagroupname, SUM(c.weight))FROM Criteriatable c WHERE c.projectid = :projectid GROUP BY c.criteriagroupname]。内部异常:java.lang.NullPointerException
    • 我找到了解决方案,我必须为 GroupTotal 创建一个完全限定的类名。谢谢@Steve_c
    【解决方案2】:

    我认为问题在于您从 Web 方法返回 List。尝试返回您自己的包装类,该类将在其中包含列表作为字段。像这样的

    public class CriteriatablesWrapper {
        private List<Criteriatable> criteriatableList;
        // getter and setter
    }
    

    并将您的服务方法签名更改为

    @WebMethod(operationName = "getAllCriteriaGroupByProjectid")
    public CriteriatablesWrapper getAllCriteriaGroupByProjectid(@WebParam(name = "projectid") int projectid) {
        ...
    }
    

    【讨论】:

    • 说实话,你刚刚所做的让我更加困惑。通常,当我不使用带有 sum 函数的 group by 时,我会得到我的结果。但是我的问题是有没有一种方法可以做到这一点而没有任何复杂性。我有另一种方法可以做到这一点,但这不是一个好的编码实践。我可以加入需要总和聚合的列。如果你能解释我怎么做你在这里写的这个包装类,我会很高兴
    • 哦,如果它在没有组的情况下工作,那么我不明白你的问题是什么。您需要比较使用和不使用 group by 的结果,并准确查看哪些对象无法编组。可能Criteriatable 的某些字段在没有 group by 的情况下为空,而不是为空,这会导致问题。
    猜你喜欢
    • 2014-09-29
    • 2017-05-13
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2012-11-19
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多