当前位置: 首页 > 知识库问答 >
问题:

Apache Camel没有可用的类型转换器

宗政金鹏
2023-03-14

我用camel定义了一个处理器,它允许我使用计时器生成一个jaxb-javabean,并将pojo写入xml文件。但当我启动应用程序时,我遇到了以下错误:

08:09:00 WARN[or.ap.ca.co.ti.时间消费者](骆驼(骆驼-1)线程#2-定时器://生成发票)错误处理交换。交换[20E715FDB7EFE19-0000000000000000]。由:[java.io.IOEx

我的代码如下:

from("timer:generateInvoice?period={{xml.timer.period}}&delay={{xml.timer.delay}}")
        .log("Generating randomized invoice XML data")
        .process("invoiceGenerator")
        .marshal(jaxbDataFormat)
        .to("file:{{xml.location}}");
            

发电机波纹管:

@Override
    public void process(Exchange exchange) throws Exception {

        Random random = new Random();
        List<Invoice> invoices = new LinkedList<>();

        for (int i = 0; i < 100; i++) {

            String invoiceNumber = String.format("invoice-%d", random.nextInt());

            Invoice invoice = new Invoice();
            invoice.setInvoiceNumber(invoiceNumber);
            invoice.setAmount(random.nextDouble());

            Instant now = Instant.now();

            GregorianCalendar cal1 = new GregorianCalendar();
            cal1.setTimeInMillis(now.toEpochMilli());
            invoice.setInsertionDate(DatatypeFactory.newInstance().newXMLGregorianCalendar());
            invoice.setInvoiceType(INVOICE_TYPE[random.nextInt(INVOICE_TYPE.length)]);
            invoices.add(invoice);
        }
        exchange.getMessage().setBody(invoices);
    }

我已经尝试将java.util.LinkedList的转换器实现为所需的类型:java.io.InputStream

跟:

@Converter
    public InputStream ListToInputStream(List<Invoice> invoices) throws IOException {

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ByteArrayInputStream bios = null;
            try {

                ObjectFactory objFactory = new ObjectFactory();

                JAXBContext jaxbContext = JAXBContext.newInstance("com.webinage.model");
                Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

                for(Invoice invoice : invoices) {
                    marshaller.marshal(invoice, baos);
                }
                bios = new ByteArrayInputStream(new byte[baos.size()]);
                bios.read(baos.toByteArray());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                baos.close();
            }
            return bios;
    }

但是同样的例外出现了…你有什么想法吗?

共有1个答案

乔伯寅
2023-03-14

很可能列表不是您想要放入交易所的内容。我假设您希望输出 XML 如下所示:

<Invoices>
 <Invoice>...</Invoice>
 <Invoice>...</Invoice>
 ...
</Invoices>

在这种情况下,声明一个容器类可能是最简单的:

@XmlRootElement
public class Invoices {
  private List<Invoice> invoices;
}

(省略getter和setter)。

然后生成您的模式,并将这个< code>Invoices对象放入交换中。

 类似资料:
  • 我首先有一个多部分文件,我想把它发送到camel管道,并用原始名称保存这个文件。 我的代码: 另一方面,我有: from(“seda:rest_upload”).convertBodyTo(File.class).to(“file://rest_files"); 我也尝试注册转换器: 当我执行我的代码时,我看到下面的stacktrace: 如何解决这个问题?

  • 我是阿帕奇骆驼的新手。我正在使用带有Apache Camel和Spring Boot集成的REST API。我已完成获取请求,它按预期工作。但是,在使用 POST 调用发布数据时,我遇到了一个问题。 我在下面的链接中看到了类似的错误。但是,这对我没有帮助。NoTypeConversionAvailableException:没有可从类型转换的类型转换器: 我已经尝试了Stackoverflow,y

  • 我想生成一个方法,将对象转换为映射字符串,然后再从映射字符串返回到对象。 我按如下方式生成初始对象: 然后,以下方法将给定的映射[字符串,\u]转换为对象: 在下面的方法中,我将初始的转换为,然后返回(通过调用上面的方法): 所以如果我打电话: 输入和输出将匹配。 问题,尝试更进一步,我现在想对类型为名称的字段执行相同的操作。但我希望这一步骤是通用的,因为在不知道字段名称的类型的情况下,我可以将其

  • 问题内容: 还有其他一些SO问题在讨论可以使用Eclipse的编译器而不是javac进行泛型编译的问题(即Java:泛型在Eclipse和javac中处理不同,而泛型可以在Eclipse中编译和运行,但不能在javac中编译)-但这看起来就像一个稍微不同的人。 我有一堂课: 我还有一个带有方法的类,该方法接受来自以下类型的任意对象: 这在Eclipse中可以正常工作,但是当我使用进行了干净的构建时

  • 在其他地方,我需要从中的内容创建一个。所以,我这样做: 此外,在这里使用进行一些转换,以便每次都用每一个小东西清理它,一方面为我提供编译时保证和安全性,但这在大多数情况下是一个大麻烦。有没有一些短手来绕过这些情况?