我有这条骆驼路线:
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:它也可以用于制作人。当它用于生产者时,简单表达式可以用作参数值。它 允许您从邮件正文标头中检索参数值 等等。
答案 0 :(得分:5)
我希望现在回答还为时不晚。无论如何我在我的项目中遇到了类似的问题,客户端使用参数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" +
"¶meters={\"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" />
参考文献: