【问题标题】:JAX-RS - MOXy JAXB - ClassCastException when transforming List<List<Object>> to JSONJAX-RS - MOXy JAXB - 将 List<List<Object>> 转换为 JSON 时出现 ClassCastException
【发布时间】:2014-05-20 13:38:07
【问题描述】:

在我的应用中,我在 Glassfish 服务器上使用 MOXy JAXB 和 JAX-RS (Jersey),

我有以下 REST 网络服务:

@Named 
@RequestScoped
@Path("/product")
public class ProductService extends BaseServiceFacade<Product, Integer, ProductVO> {

@EJB(mappedName="java:global/myAppEAR/myAppEJB/ProductServiceRest")
ProductServiceRestRemote productServiceRestRemote;

// ...

    @GET    
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Path("/featuredlists")
    public List<List<ProductVO>> featuredlists() {
        return productServiceRestRemote.featuredlists();
    }

}

当我尝试测试 REST 服务访问时: 本地主机:8080/atlanteusPortal/rest/product/featuredlists

我明白了:

java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.getDomainClass(MOXyJsonProvider.java:267)

如果我在方法返回之前放置一个调试断点,我可以看到 List&lt;List&lt;ProductVO&gt;&gt; chunkList 已填充但未转换为 JSON

有人可以指出使用 JAX-RS MOXy 和 Jersey 通过 JSON 发送 List&lt;List&lt;Object&gt;&gt; 类型的解决方案吗?

【问题讨论】:

    标签: rest jaxb glassfish jax-rs moxy


    【解决方案1】:

    我使用一种将列表列表封装在对象内的解决方法解决了这个问题

    称为 ProductListVO:

    @XmlRootElement 
    public class ProductListVO extends BaseVO<String> {
    
        private List<ProductVO> productVOs; 
    
        public List<ProductVO> getProductVOs() {
            return productVOs;
        }
    
        public void setProductVOs(List<ProductVO> productVOs) {
            this.productVOs = productVOs;
        }
    
        public static ProductListVO buildVO(List<Product> t) {
            ProductListVO vo = new ProductListVO();
    
            List<ProductVO> prodVOs = new ArrayList<ProductVO>();       
            StringBuilder sb = new StringBuilder();
    
            for (Product product : t) {
                sb.append(product.getId()).append('-');
                prodVOs.add(ProductVO.buildVO(product));
            }
    
            vo.setId(sb.substring(0, sb.length() - 1));
            vo.setProductVOs(prodVOs);
    
            return vo;
        }
    }
    

    在服务方法中:

    @GET    
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Path("/featured")
    public List<ProductListVO> featuredlists() {
        return productServiceRestRemote.featuredLists();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多