2017-05-07 53 views
2

我有這個駱駝航線:如何通過header在Apache Camel JPA中傳遞namedQuery參數?

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"); 

但它無法正常工作

有沒有任何方法可以通過heade設置jpa屬性RS?駱駝文檔引用這parameters選擇,但我不發現的例子

選項:parameters

此選項是基於註冊表這就需要#符號。鍵/值映射用於構建查詢參數。它是 期望是泛型類型java.util.Map,其中 這些鍵是給定JPA查詢的命名參數,值 是它們對應的有效值要選擇。駱駝 2.19:它也可以用於生產者。當它用於生產者時,簡單表達式可以用作參數值。它 允許您從郵件正文標題 檢索參數值等

+0

[駱駝JPA查詢參數沒有被人看見(HTTP的可能重複: //stackoverflow.com/questions/36609830/camel-jpa-query-parameters-not-being-seen) – Strelok

+0

但我不明白如何使用註冊表。我找不到任何其他的例子。你能舉個例子嗎? – smftr

回答

4

我希望這不是太晚了回答。無論如何,我在我的項目中遇到過類似的問題,客戶端使用參數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); 
    } 
} 

記住將其添加到上下文中。在春天一樣的東西:

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

參考文獻: