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

smf*_*ftr 2 jpa apache-camel

我有这条骆驼路线:

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

这是我的用户实体:

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

但它没有用

是否有任何方法可以通过标头设置jpa属性?骆驼文档引用了这个parameters选项,但我没有找到这些例子

选项: parameters

此选项基于注册表,需要#表示法.此键/值映射用于构建查询参数.它应该是泛型类型java.util.Map,其中键是给定JPA查询的命名参数,值是您要为其选择的相应有效值.骆驼2.19:它也可以用于制作人.当它用于生产者时,Simple表达式可以用作参数值.它允许您从邮件正文标题等中检索参数值.

小智 5

我希望现在回答还为时不晚.无论如何我在我的项目中遇到了类似的问题,客户端使用参数执行HTTP GET,idJPA查询使用该参数,结果最终被编组回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)
}
Run Code Online (Sandbox Code Playgroud)

这是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住将其添加到上下文中.在Spring中是这样的:

<bean id="myStringToMapTypeConverter" class="....StringToMapTypeConverter" />
Run Code Online (Sandbox Code Playgroud)

参考文献: