В ApacheServiceMix 7.0.0 я определил следующие маршруты с помощью Blueprint:
<reference id="dataSource" interface="javax.sql.DataSource" filter="(dataSourceName=connectuserdata)" />
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
<property name="dataSource" ref="dataSource" />
</bean>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<package>com.focuscura</package>
<dataFormats>
<!-- here we define a Json data format with the id jack and that it should use the TestPojo as the class type when
doing unmarshal. The unmarshalTypeName is optional, if not provided Camel will use a Map as the type -->
<json id="userdata" library="Jackson" />
</dataFormats>
<route id="connect.userdata_create">
<from uri="jetty:http://localhost:8881/userdata?httpMethodRestrict=POST"/>
<unmarshal ref="userdata"/>
<!--<process ref="scalaUserDataProcessor"/>-->
<log message="Received new userdata" />
<to uri="sql:INSERT INTO public."UserData" (lastname, firstname) VALUES (:#lastname , :#firstname)"/>
</route>
<route id="connect.userdata_get2">
<from uri="jetty:http://localhost:8881/userdata2?httpMethodRestrict=GET"/>
<to uri="sql:SELECT * FROM public."UserData" WHERE id = :#id"/>
<!--<process ref="scalaUserDataProcessor"/>-->
<marshal ref="userdata"/>
</route>
</camelContext>
The Datasource is installed as a seperate service following the instructions as described in this post: How can I install postgresqljdbc to work in Karaf OSGi?
Это нормально работает! Я могу отправить JSON на URL-адрес Jetty, и он будет вставлен в базу данных. Но когда я пытаюсь получить данные с этой конечной точки, я получаю следующую ошибку
org.osgi.service.blueprint.container.ServiceUnavailableException: The Blueprint container is being or has been destroyed: (&(dataSourceName=connectuserdata)(objectClass=javax.sql.DataSource))
at org.apache.aries.blueprint.container.ReferenceRecipe.getService(ReferenceRecipe.java:241)
at org.apache.aries.blueprint.container.ReferenceRecipe.access$000(ReferenceRecipe.java:56)
at org.apache.aries.blueprint.container.ReferenceRecipe$ServiceDispatcher.call(ReferenceRecipe.java:306)
at Proxyb6abdd30_6f59_4e89_a419_c4ff0558aa62.equals(Unknown Source)
at java.util.WeakHashMap.eq(WeakHashMap.java:287)
at java.util.WeakHashMap.get(WeakHashMap.java:401)
at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:204)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:140)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.
Странно то, что когда я заменяю <to uri="sql:SELECT * FROM public."UserData" WHERE id = **:#id**"/>
на <to uri="sql:SELECT * FROM public."UserData" WHERE id = **2**"/>
, он снова работает нормально, и я получаю небольшой симпатичный JSON пользователя №2.
Любые намеки на то, как это решить?
Проблема была не в моем маршруте или верблюде. Это было вызвано PostgreSQL. Используя параметр в моем маршруте, мне нужно было предоставить явное приведение типов.
dataSource=dataSource&allowNamedParameters=true
- person Alexey Yakunin   schedule 26.09.2016<route id="connect.userdata_get2"> <from uri="jetty:http://localhost:8881/userdata2?httpMethodRestrict=GET"/> <log message="$simple{in.header.id}" /> <to uri="sql:SELECT lastname FROM public."UserData" WHERE id = :#id?dataSource=dataSource&allowNamedParameters=true"/> </route>
и помещаю существующее имя в параметр GET моего запроса, он просто отлично работает. - person Sander Kouwenhoven   schedule 26.09.2016