2011-10-21 29 views
12

Tôi đang tạo một ứng dụng web Java mới với Spring MVC 3.0 và muốn sử dụng càng nhiều công cụ Java EE 6 chuẩn càng tốt. (Tôi đang ở Glassfish 3.1.1.) Trình điều khiển thực sự muốn sử dụng một khung công tác web MVC hơn là JSF.Sử dụng Spring MVC 3.0 và chú thích @EJB wtihout mappedName?

Vì vậy, tôi đang tìm cách tốt nhất để tiêm EJB vào bộ điều khiển Spring của tôi. Tôi đã có một số thành công nhưng tôi không hài lòng với nó trông như thế nào và tôi hy vọng tìm được một cách tốt hơn.

này làm việc, bằng cách tìm các EJB qua JNDI:

// EJB 
@Stateless 
public class Service { 
    @PersistenceContext(name="MAIN") 
    private EntityManager em; 

    public void doSomething() { .... } 

} 

// Spring 
@Controller 
public class HomeController { 
    @EJB(mappedName="java:global/springtest/Service") 
    private Service service; 

    // controller methods use service 
} 

Nhưng tôi hài lòng với những cần "mappedName" trên chú thích @EJB trong bộ điều khiển.

Có cách nào tốt hơn để thực hiện việc này không?

Tin tốt là tôi có thể sử dụng cùng một chú thích @Inject trong các EJB và Spring bean và sự khác biệt duy nhất là khung công tác đang tạo đối tượng và thực hiện việc tiêm.

Trả lời

-1

Đối với mùa xuân, bạn có thể quấn tra cứu JNDI vào JndiObjectFactoryBean:

<bean id="serviceBean" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:global/springtest/Service" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

Sau đó, bạn sẽ lẽ (đúng cho tôi nếu tôi sai) có thể sử dụng nó với @Injectmà không sự @Named("serviceBean") chú thích:

@Inject 
private Service service; 
+0

Điều đó chỉ đẩy vấn đề lên XML, điều này khiến IMO tệ hơn. – wrschneider

+0

@ wrschneider99 Tại sao? Bạn muốn loại bỏ tham số * mappedName * và bạn đã nhận được nó. Đó không phải là câu hỏi? Nếu không, bạn có thể thực hiện tra cứu JNDI trong mã và điều đó sẽ hoàn toàn di động, nhưng xấu xí. – MaDa

+0

Tôi đã hy vọng rằng có một số cách mà tra cứu JNDI có thể xảy ra theo quy ước, chẳng hạn như một mappedName rõ ràng là không cần thiết. Hoặc nếu cần thiết, tôi sẽ không bận tâm việc đẩy cấu hình này vào chú thích không quốc tịch, để tận dụng lợi thế của bất kỳ giá trị mặc định nào có liên quan đến cách giải thích EJB của Spring. – wrschneider

2

Nếu bạn sử dụng

mappedName="java:module/Service" 

thay vì

mappedName="java:global/springtest/Service" 

bạn không phải lo lắng về các appname. Điều này làm cho mã dễ di chuyển hơn. Tôi đoán điều đó sẽ giải quyết một số vấn đề của bạn

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