2013-04-15 25 views
14

Tôi hiện đang làm việc trên một ứng dụng OSGi đang chạy dưới apache Karaf sử dụng JPA và QueryDSL.Có thể tích hợp OSGi với dữ liệu Spring không?

tôi đã tự hỏi nếu tôi có thể sử dụng dữ liệu mùa xuân với QueryDSL thay vì cách tiếp cận hiện nay.

Lý do cho điều này là tôi tìm kho mùa xuân là khá hữu ích và có một khuôn mẫu cho cơ sở dữ liệu NoSQL truy cập có thể có ích trong tương lai.

Tôi đã cố gắng khởi động một ứng dụng mùa xuân bình thường mà không có ngữ cảnh web với OSGi nhưng tôi nhận được một ClassNoutFoundException khi nó cố tải ứng dụngContext.xml hoặc lớp ApplicationContext.class.

Tôi không muốn sử dụng mùa xuân DM vì nó được ngưng.

Về cơ bản các lý do duy nhất vì muốn thử tích hợp này là dành cho các Repositories mùa xuân, nhưng nếu bạn nghĩ rằng đây là không cần thiết xin vui lòng cho tôi biết. Bất kỳ thông tin nào liên quan đến cách đạt được điều này hoặc nếu được chấp nhận thì điều này sẽ được hoan nghênh hơn.

Cảm ơn bạn

Cập nhật

tôi đã quản lý để làm cho công việc mùa xuân bằng cách bắt đầu bối cảnh ứng dụng với org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext. ApplicationContext được xuất trong OSGi như một dịch vụ và tôi có thể nhận được tất cả các bean mà tôi cần bằng cách gọi nó.

Vấn đề tôi đang gặp ngay bây giờ là khi tôi tuyên bố <jpa:repositories base-package="x.y.z" /> tôi nhận được ngoại lệ sau đây:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in URL [bundle://251.13:0/META-INF/spring/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1109)[187:org.springframework.context:3.1.4.RELEASE] 
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.registerBeanPostProcessors(AbstractDelegatedExecutionApplicationContext.java:502)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE] 
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.registerBeanPostProcessors(AbstractDelegatedExecutionApplicationContext.java:451)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE] 
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:306)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE] 
    at org.eclipse.gemini.blueprint.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE] 
    at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:290)[193:org.eclipse.gemini.blueprint.core:1.0.0.RELEASE] 
    at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:137)[194:org.eclipse.gemini.blueprint.extender:1.0.0.RELEASE] 
    at java.lang.Thread.run(Thread.java:662)[:1.6.0_37] 
Caused by: java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation. 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:142)[195:org.springframework.transaction:3.1.4.RELEASE] 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79)[195:org.springframework.transaction:3.1.4.RELEASE] 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70)[195:org.springframework.transaction:3.1.4.RELEASE] 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:103)[195:org.springframework.transaction:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1475)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1443)[185:org.springframework.beans:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)[185:org.springframework.beans:3.1.4.RELEASE] 

Là nhà cung cấp JPA Tôi đang sử dụng OpenJPA. EntityManagerFactory là một dịch vụ mà tôi có thể nhận được bằng cách sử dụng kế hoạch chi tiết. Tôi nghĩ rằng tôi cần phải tham khảo nó trong <jpa:repositories base-package="x.y.z" />, nhưng làm thế nào để tôi làm điều đó kể từ khi applicationContext.xml được đọc bởi mùa xuân và không phải là kế hoạch chi tiết?

Tôi thực sự đánh giá cao bất kỳ gợi ý nào về đúng hướng.

Cảm ơn bạn

Trả lời

4

Vâng, bạn có một vài lựa chọn ở đây, cố gắng làm cho nó chạy với kế hoạch chi tiết (có lẽ là khó khăn nhất - kể từ khi bạn cần phải gọi đậu mùa xuân, nhưng tôi nghĩ vẫn có thể được thực hiện), sử dụng Karaf 3.0.0.RC1 nó cũng hỗ trợ Blueprint Geminin có hỗ trợ chặt chẽ hơn cho Spring và cuối cùng nhưng không kém phần Spring-DM, ngay cả khi bạn ngừng sử dụng và có thể sử dụng phương pháp tốt nhất là sử dụng spring-dm cho một số phần cụ thể mùa xuân và std. Kế hoạch chi tiết cho phần còn lại. Bởi vì bạn chỉ sử dụng các dịch vụ thông qua cả hai khuôn khổ, mọi thứ sẽ hoạt động, chỉ cần không trộn các mô tả mùa xuân và kế hoạch chi tiết trong một gói.

+0

Xuân DM không ngưng. Nó được đổi tên thành "Gemini Blueprint". –

+0

Nhưng bây giờ nó là kế hoạch chi tiết hơi khác một chút so với cú pháp spring-dm, do đó người ta có thể gọi nó là "ngưng". Tôi vẫn sử dụng nó cho các tình huống nhất định ... :) –

+0

Cảm ơn Achim Nierbeck. Vì câu trả lời của bạn, tôi thấy rằng lớp Spring DM đã làm cho Spring hoạt động. Tôi cũng đã cập nhật câu trả lời của mình. Nếu bạn biết bất cứ điều gì về việc tích hợp Apache Karaf với dữ liệu mùa xuân, tôi thực sự sẽ đánh giá cao nó. Cảm ơn một lần nữa :) – Marius

3

Sử dụng Querydsl-SQL trực tiếp trong mã của bạn và

  • nó sẽ làm việc tốt trong OSGi như nó không sử dụng lớp tải, dệt, tăng cường, bộ nhớ đệm và thủ thuật khác mà âm thanh thực sự tốt nhưng gây ra sự hỗn loạn
  • mã của bạn sẽ chạy nhanh hơn nhiều so với bất kỳ công cụ JPA "cache nâng cao"
  • người khác sẽ có thể hiểu mã của bạn (không giống như truy vấn API Tiêu chí JPA)
  • bạn sẽ biết chính xác lệnh SQL nào chạy trên Máy chủ cơ sở dữ liệu giúp giảm thiểu sự cố Hiện -solving
  • mã của bạn sẽ như cơ sở dữ liệu độc lập như với bất kỳ công cụ ORM

Không sử dụng mùa xuân, mùa xuân-dữ liệu, JPA và công nghệ monoholitic khác cùng với OSGi như

  • họ được thiết kế để hoạt động trong một hệ thống đơn ngữ, không phải trong các gói riêng lẻ, không phải trong các gói riêng lẻ
  • bằng cách sử dụng các công nghệ này cùng với OSGi bạn sẽ dành phần lớn thời gian để sửa các lỗi như thế này và tìm cách giải quyết

Những người tranh luận với điều này, đã dành rất nhiều thời gian để tìm cách giải quyết như vậy. Họ quản lý để thực hiện một số logic kinh doanh. Họ hy vọng rằng bây giờ họ thực sự tìm được cách giải quyết cho mọi vấn đề khái niệm và họ không phải chi tiêu cùng một lượng công việc vào lần tới. Họ đang ở trong một bidding fee auction. Hãy thành thật nhé! Một nơi nào đó sâu bạn biết tôi đúng ;-).

Tôi nói điều này với những kinh nghiệm mà tôi

  • cố gắng ngăn xếp hoàn hảo dựa trên Hibernate và Don't repeat the DAO bài viết của IBM (nhiều trước khi cường điệu mùa xuân-Data bắt đầu). Hai lần
  • viết hibernate-osgi-adapter cho Hibernate 4.1.x
  • Re-implemented chương JPA hoàn chỉnh các đặc điểm kỹ thuật OSGi Enterprise
+1

P.s .: Tôi không viết câu trả lời này cho tiền thưởng. Tôi đã viết điều này để đưa lỗi vào tai của các nhà phát triển, những người đã sử dụng ORM hoàn hảo dựa trên chồng tích hợp mọi lớp, nhưng họ dành 50% thời gian của họ tìm cách giải quyết. –

+0

Điều này không thực sự trả lời cho câu hỏi của tôi. Tôi vẫn chưa thực sự thuyết phục, ngay cả khi tôi biết sâu sắc :), rằng bạn có thể đúng;). Nhưng điều này là rõ ràng, đủ để cho phép tôi trao cho bạn tiền thưởng. –

Các vấn đề liên quan