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

如何避免在pojo中使用驼峰依赖camel示例spring boot rest jpa:

傅毅然
2023-03-14

camel示例Spring靴支架jpa

我在看rder.java:

@Consumed
public void setProcessed() {
}

我知道这是必需的,这样Camel就不需要重新处理已处理的订单。然而,如果不向订单添加驼峰依赖项,如何实现这一点呢。爪哇波乔?

原因:在现实生活中,我们需要在不向pojo添加外部依赖的情况下实现相同的功能。

裁判:https://github.com/apache/camel/blob/master/examples/camel-example-spring-boot-rest-jpa/src/main/java/org/apache/camel/example/spring/boot/rest/jpa/Order.java

编辑1:按照克劳斯的建议,创建了一个自定义删除处理器

public class OrderProcessedHandler implements DeleteHandler<Order>{
    @Override
    public void deleteObject(EntityManager arg0, Object arg1, Exchange arg2) {
        ((Order) arg1).setProcessed(true);
    }
}

并在endpointuri中指定:

    // A second route polls the DB for new orders and processes them


from("jpa:sb.app.bo.Order" 
+ "?consumer.namedQuery=new-orders"
+ "&consumer.delay={{example.processOrderPeriod:25s}}"
+ "&consumeDelete=false"
+ "&deleteHandler=sb.app.camel.routes.OrderProcessedHandler")
.routeId("process-order")
.log("Processed order #id ${body.id} with ${body.amount} ");

无法使用处理程序,错误日志:

2017-10-31 15:45:33.688 ERROR 1429 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed

org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route process-order: Route(process-order)[[From[jpa:sb.app.bo.Order?consumer.name... because of Failed to resolve endpoint: jpa://sb.app.bo.Order?consumeDelete=false&consumer.delay=25s&consumer.namedQuery=new-orders&deleteHandler=sb.app.camel.routes.OrderProcessedHandler due to: Could not find a suitable setter for property: deleteHandler as there isn't a setter method with same type: java.lang.String nor type conversion possible: No type converter available to convert from type: java.lang.String to the required type: org.apache.camel.component.jpa.DeleteHandler with value sb.app.camel.routes.OrderProcessedHandler
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1831) ~[camel-core-2.20.0.jar:2.20.0]
    at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:136) ~[camel-spring-2.20.0.jar:2.20.0]
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:174) ~[camel-spring-2.20.0.jar:2.20.0]

解决方案(基于@claus建议):

// A second route polls the DB for new orders and processes them
from("jpa:sb.app.bo.Order"  //select * from orders where consumed = false
    + "?consumer.namedQuery=query_new_orders"
    + "&consumer.delay={{example.processOrderPeriod:5s}}"
    + "&consumeDelete=false"
    + "&deleteHandler=#orderProcessedMarker")
    .routeId("process-order")
    .log("Processed order #id ${body.id} with ${body.amount} copies of the «${body.book.description}» book");

DeleteHandler bean:

@Bean(name = "orderProcessedMarker")
public DeleteHandler<Order> createOrderProcessHandler() {
    return new DeleteHandler<Order>() {
        @Override
        public void deleteObject(EntityManager arg0, Object arg1, Exchange arg2) {
            ((Order) arg1).setProcessed(true);
        }
    };
}

共有1个答案

翁昊乾
2023-03-14

您可以使用可以在JPAendpoint上配置的自定义deleteHandler而不是使用@消耗

>

  • https://github.com/apache/camel/blob/master/components/camel-jpa/src/main/java/org/apache/camel/component/jpa/DeleteHandler.java

    https://github.com/apache/camel/blob/master/components/camel-jpa/src/main/docs/jpa-component.adoc

  •  类似资料:
    • 如果我正在创建一个带有如下头文件的静态库: 在我自己的项目中,我可以告诉编译器(在我的例子中是Visual Studio)在哪里查找SomeHeaderFile.h。但是,我不希望我的用户关心这一点--他们应该能够包含我的头,而不必通知编译器SomeHeaderFile.h的位置。 这类情况通常如何处理?

    • 问题内容: 我尝试使用MVP范例构建Webapp。因为我希望API干净并且使所有内容易于测试,所以我尝试通过Contructor Injection注入所有可能的内容。现在,我到了一个具有多个文本字段的视图。当数据库中有值时,演示者将填充这些文本字段,因此我的演示者需要视图的引用,但是vie显然也需要演示者的引用。CDI告诉我,由于循环依赖性,无法将Presenter注入视图。是否有可能避免通过s

    • 问题内容: 我在MySQL中使用触发器存在一些问题。 假设我们有2个表: 表A 表B 和2个触发器: TriggerA:在TableA上删除并更新TableB时触发 TriggerB:在TableB上删除并在TableA中删除时触发 问题是,当我删除TableB中的某些行时,TriggerB触发并删除TableA中的某些元素,然后TriggerA触发并尝试更新TableB。 它失败,因为Trigg

    • 我听说过很多关于在Excel VBA中使用的憎恶是可以理解的,但我不确定如何避免使用它。我发现,如果我能够使用变量而不是函数,那么我的代码将更加可重用。但是,如果不使用,我不确定如何引用东西(如等)。 我已经找到了这篇关于范围的文章和这个关于不使用select的好处的例子,但是我找不到任何关于如何使用的东西。

    • 问题内容: 我在JUnit中有许多测试用例。它们都需要相同的代码才能在其静态方法中执行。这是代码重复,我正在努力摆脱它。这样做是一种肮脏的方式。JUnit中是否还有其他机制可能会有所帮助? PS。我写了关于这个主题的博客文章:http : //www.yegor256.com/2015/05/25/unit-test- scaffolding.html 问题答案: 规则是构成可重用代码(而不是从其

    • 我想验证一下,给定包中的类只引用驻留在包本身中的类。然而,我遇到了一个冲突,告诉我a类依赖于例如java.lang.String,这对我来说是完全可以的。有没有一种方法可以忽略基本的java包?