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

如何在Apache Camel JPA中通过标头传递namedQuery参数?

白嘉志
2023-03-14

我有一条骆驼路线:

from("direct:getUser")
    .pollEnrich("jpa://User?namedQuery=User.findById&consumeDelete=false");

这是我的用户实体:

@Entity
@NamedQueries({
    @NamedQuery(name="User.findAll", query="SELECT u FROM User u"),
    @NamedQuery(name="User.findById", query="SELECT u FROM User u WHERE u.id = :id")
})
public class User{
    @Id
    private String id;
}

我通过设置标题尝试了这条路线:

from("direct:getUser")
    .setHeader("id", simple("myid"))
    .pollEnrich("jpa://User?namedQuery=User.findById&consumeDelete=false");

但它不起作用

有什么方法可以通过标题设置jpa属性吗?camel文档在parameters选项中引用了这一点,但我没有找到示例

选项:参数

此选项基于注册表,需要#符号。这个键/值映射用于构建查询参数。它应该是java的泛型。util。映射,其中键是给定JPA查询的命名参数,值是要为其选择的相应有效值。骆驼2.19:它也可以用于生产者。当它用于producer时,简单表达式可以用作参数值。它允许您从消息正文标题等中检索参数值。

共有1个答案

乔宏峻
2023-03-14

我希望现在回答还不晚。在任何情况下,我的项目中都有类似的问题,客户机使用参数id执行HTTP GET,JPA查询使用该参数,结果最终被封送回HTTP客户机。我正在Spring应用程序中运行camel。

我终于想出了如何以一种相当干净的方式实现它。

这是定义路由的RouteBuilder

@Override
public void configure() throws Exception {

    Class dataClass = SomeClass.class;
    JacksonDataFormat format = new JacksonDataFormat();
    format.setUnmarshalType(dataClass);

    String jpaString = String
            .format("jpa://%1$s?resultClass=%1$s&namedQuery=q1" +
                    "&parameters={\"id\":${headers.id}}", dataClass.getName());

    from("jetty://http://localhost:8080/test").toD(jpaString) // note the .toD
        .marshal(format)
}

这是StringToMapTypeConverter类,否则camel无法将{“id”:X}转换为映射

public class StringToMapTypeConverter implements TypeConverters {

    private static final ObjectMapper mapper = new ObjectMapper();
    private static JavaType mapType;

    static {
        mapType = mapper.getTypeFactory().constructMapType(Map.class,
                String.class, Object.class);
    }

    @Converter
    public Map<String, Object> toMap(String map) throws IOException {
        return mapper.readValue(map, mapType);
    }
}

记得把它添加到上下文中。Spring是这样的:

<bean id="myStringToMapTypeConverter" class="....StringToMapTypeConverter" />

参考文献:

  • http://camel.apache.org/jpa.html
  • http://camel.apache.org/message-endpoint.html#MessageEndpoint-DynamicTo
  • http://camel.apache.org/type-converter.html#TypeConverter-Addtypeconverterclassesatruntime
 类似资料:
  • 问题内容: 我已经按照npm软件包文档中的建议编写了axios POST请求,例如: 它可以工作,但是现在我修改了后端API以接受标头。 内容类型:“ application / json” 授权:“ JWT fefege …” 现在,此请求在Postman上可以正常工作,但是在编写axios调用时,我遵循 此链接 ,无法完全正常工作。 我经常出错。 这是我的修改请求: 任何帮助是极大的赞赏。 问

  • 问题内容: 我正在使用PhantomJS page.evaluate()进行抓取。我的问题是我传递到Webkit页面的代码是沙盒化的,因此无法访问我的主要幻象脚本的变量。这使得很难使抓取代码通用。 如何将参数推入页面? 问题答案: 我遇到了确切的问题。可以使用一些技巧,因为它也可以接受字符串。 有几种方法可以执行此操作,但是我使用了一个称为的包装器,该包装器接受其他参数以传递给必须在Webkit端

  • 在React Router v4中,如何使用传递参数?

  • 问题内容: 如何通过$ _GET将数组类型的一个或多个变量传递给另一页? 我总是以以下形式传递变量值 那传球呢? 我是否需要编写一个for循环并附加所有值? 谢谢 问题答案: 您可以使用语法通过_GET传递数组: PHP理解此语法,因此等于。 您还可以指定键: 多维数组也可以工作: 自动执行此操作: 一种替代方法是传递json编码的数组: 您可以解析为: 并再次使用json_encode对其进行编

  • 问题内容: 我有一个请求URI和一个令牌。如果我使用: 等等,我得到200并查看相应的JSON数据。因此,我安装了请求,并且当我尝试访问该资源时,我得到了403,这可能是因为我不知道传递该令牌的正确语法。谁能帮我解决这个问题?这就是我所拥有的: 我已经尝试过: 但是这些都不起作用。 问题答案: 在python中: 相当于 并要求翻译 当您希望请求使用基本身份验证并设计授权标头时,如下所示: 这是b

  • 本文向大家介绍Python中的参数如何通过值或引用传递?,包括了Python中的参数如何通过值或引用传递?的使用技巧和注意事项,需要的朋友参考一下 Python使用的机构,这被称为“呼叫逐对象”,有时也被称为“呼叫由对象参考”或“呼叫通过共享” 如果将不变的参数(例如整数,字符串或元组)传递给函数,则传递的行为类似于C all-by-value。如果传递可变参数,则有所不同。 Python语言中的