private static Class resolveType(PropertyDescriptor d) {
   if (TypeResolver.isIntegerType(d.getPropertyType())) {
     return Integer.class;
   } else if (TypeResolver.isLongType(d.getPropertyType())) {
     return Long.class;
   } else if (TypeResolver.isBooleanType(d.getPropertyType())) {
     return Boolean.class;
   } else {
     return d.getPropertyType();
   }
 }
  @SuppressWarnings("unchecked")
  public byte[] export(
      String title, List<ClearingItem> exportList, List<PropertyDescriptor> props) {

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    if (exportList == null || exportList.size() == 0) {
      return new byte[0];
    }

    try {
      Object bean = exportList.get(0);
      BeanInfo infoTo = Introspector.getBeanInfo(bean.getClass());
      PropertyDescriptor[] d = infoTo.getPropertyDescriptors();

      if (props == null || props.isEmpty()) {

        props = new ArrayList<PropertyDescriptor>();

        for (int i = 0; i < d.length; i++) {
          try {

            Class pType = d[i].getPropertyType();

            if (pType.isAssignableFrom(Class.class)) {
              continue;
            }

            if (TypeResolver.isBooleanType(pType)) {
              // ok
            } else if (TypeResolver.isPrimitiveType(pType)) {
              // ok
            } else if (TypeResolver.isDateType(pType)) {
              // ok
            } else if (TypeResolver.isEnumType(pType)) {
              // ok
            } else {
              log.warning("Skip type " + pType);
              continue;
            }

            if (d[i].getName().equals("className")
                || d[i].getName().equals("id")
                || d[i].getName().equals("version")) {
              continue;
            }

            props.add(d[i]);
          } catch (Exception ex) {
            log.severe(ex.getMessage());
            continue;
          }
        }
      }

      Map<String, String> parameters = new HashMap<String, String>();
      parameters.put("ReportTitle", title);

      JasperDesign design = getJasperDesign(props);

      JasperReport jasperReport = JasperCompileManager.compileReport(design);

      JasperPrint jasperPrint = null;

      jasperPrint =
          JasperFillManager.fillReport(
              jasperReport, parameters, new JRBeanCollectionDataSource(exportList));

      JRPdfExporter exporter = new JRPdfExporter();

      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
      exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
      exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
      exporter.setParameter(
          JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
      exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);

      // writeHeader(response, exportName);

      exporter.exportReport();

      byte[] ret = out.toByteArray();

      out.close();

      return ret;

    } catch (Throwable t) {
      log.log(Level.INFO, t.getMessage(), t);
      return null;
    }
  }