문제

In my app I'm using MOXy JAXB with JAX-RS (Jersey) on Glassfish server,

I have the following REST webservice:

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

}

When I try to test the REST service accessing: localhost:8080/atlanteusPortal/rest/product/featuredlists

I get:

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)

If I put a debug breakpoint before the method return I can see that the List<List<ProductVO>> chunkList is populated but it's not transformed into JSON

Can someone point out a solution to send a List<List<Object>> type via JSON using JAX-RS MOXy and Jersey?

도움이 되었습니까?

해결책

I solved the issue using a workaround encapsulating List of Lists inside an object

called 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;
    }
}

in Service method:

@GET    
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/featured")
public List<ProductListVO> featuredlists() {
    return productServiceRestRemote.featuredLists();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top