【问题标题】:how to pass namedQuery parameters in Apache Camel JPA by header?如何通过标头在 Apache Camel JPA 中传递 namedQuery 参数?
【发布时间】:2017-05-07 20:44:11
【问题描述】:

我有这条骆驼路线:

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 属性?骆驼文档在parameters 选项中引用了这个,但我没有找到示例

选项:parameters

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

【问题讨论】:

标签: jpa apache-camel


【解决方案1】:

我希望现在回答还为时不晚。无论如何,我在项目中遇到了类似的问题,客户端使用参数id 执行 HTTP GET,JPA 查询使用该参数,结果最终被编组回 HTTP 客户端。我在 Spring 应用程序中运行骆驼。

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

这是定义路由的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 类,否则骆驼无法将 {"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" />

参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多