Като за начало, това твърдение по-горе няма да се компилира. Беше ми посочено в друг въпрос, че има грешка в текущата документация на Apache Camel MongoDB и че setHeader
редът по-горе трябва да гласи:
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani"))
Начинът, по който в крайна сметка направих това, беше като създадох анономен Expression
:
import com.mongodb.client.model.Filters;
import com.mongodb.BasicDBObject;
import org.bson.conversions.Bson;
@Component
public class NotifyClientRoute extends RouteBuilder {
public static final String NOTIFY_CLIENT_URI = "direct:notifyClient";
@Override
public void configure() throws Exception {
from(NOTIFY_CLIENT_URI)
.log("Determining which client gets the deletion request next for DR request '${header.drRequestId}'.")
.setHeader(MongoDbConstants.CRITERIA, new Expression() {
@Override
public <T> T evaluate(Exchange exchange, Class<T> type) {
String drRequestId = exchange.getIn().getHeader("drRequestId", String.class);
Bson equalsClause = Filters.eq("drRequestId", drRequestId);
// Alternatively:
// Bson equalsClause = new BasicDBObject("drRequestId", new BasicDBObject("$eq", drRequestId));
return exchange.getContext().getTypeConverter().convertTo(type, equalsClause);
};
})
.to("mongodb:mongoClient?database=mydb&collection=mycollection&operation=findOneByQuery")
.log("Query returned: '${body}'");
}
}
Допълнителна забележка:Не измислих този оператор за връщане в Expression
. Попаднах на типови грешки и затова погледнах какъв е друг Apache Camel Expression
реализациите, включени в библиотеките на Camel, се връщаха и открих тази клауза за връщане.