2010-10-29 18 views
14

Ứng dụng Java EE 6 của tôi bao gồm một chiến tranh và một mô-đun ejb được đóng gói trong tập tin tai. Tôi đang sử dụng CDI cho DI (nghĩa là tôi có tệp bean.xml trong cả hai mô-đun). Tôi cũng muốn sử dụng bộ chặn ghi log được định nghĩa trong mô-đun ejb trong mô-đun chiến tranh. Tôi đã kích hoạt các đánh chặn ở beans.xml của ejb:CDI: Sử dụng Bộ chặn qua các mô-đun khác nhau/lưu trữ đậu

<beans> 
    <interceptors> 
     <class>com.test.interceptor.LoggingInterceptor</class> 
    </interceptors> 
</beans> 

này chỉ đang làm việc cho các lớp được chú thích với các đánh chặn trong module ejb. Các lớp trong mô-đun chiến tranh không bị chặn (mặc dù chúng được chú thích với bộ chặn). Tôi nghĩ rằng giải pháp sẽ là để kích hoạt kẻ đánh chặn trong máy bay đánh chặn của chiến tranh, cũng như (như trên). Tuy nhiên, ứng dụng không thể được triển khai với thông báo sau:

NGHIÊM TRỌNG: ngoại lệ khi tải ứng dụng: HÀN-001.417 Enabled chặn lớp lớp com.test.interceptor.LoggingInterceptor không phải là dự chú thích @Interceptor cũng không đăng ký thông qua một phần mở rộng di động

My LoggingInterceptor trông như thế này:

@Log 
@Interceptor 
public class LoggingInterceptor { 
    private static final Logger logger = Logger.getLogger(LoggingInterceptor.class.getName()); 

    static { 
     logger.setLevel(Level.ALL); 
    } 

    @AroundInvoke 
    public Object logMethod(InvocationContext ctx) throws Exception { 
     logger.log(Level.FINE, "ENTRY {0} {1}", 
       new Object[]{ ctx.getTarget().getClass().getName(), ctx.getMethod().getName() }); 
     long startTime = System.nanoTime(); 
     try { 
      return ctx.proceed(); 
     } finally { 
      long diffTime = System.nanoTime() - startTime; 
      logger.log(Level.FINE, "RETURN {0} {1}", 
       new Object[]{ ctx.getTarget().getClass().getName(), ctx.getMethod().getName() }); 
      logger.log(Level.FINE, "{0} took {1} ms", new Object[]{ ctx.getMethod(), 
        TimeUnit.MILLISECONDS.convert(diffTime, TimeUnit.NANOSECONDS)}); 
     } 
    } 

} 

Và đánh chặn ràng buộc:

@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
public @interface Log {} 

Tôi có thể sử dụng bộ chặn cho cả hai mô-đun như thế nào?

+0

Bạn đã tìm thấy giải pháp cho vấn đề này chưa? Thật thú vị khi thấy nó. – mik

+1

@milk no, tôi không có. Tôi củng cố tất cả các mô-đun thành một mô-đun chiến tranh, có thể kể từ khi Java EE 6. – Theo

+0

wow, cảm ơn vì đã đặt ra điều này một cách rõ ràng. Tôi đã có cùng một vấn đề chính xác và hợp nhất tất cả nó thành một mô-đun đã giải quyết nó. Đôi khi J2EE chỉ cố gắng làm cho mọi thứ trở nên khó khăn trên ya ... – JoshC13

Trả lời

1

Tôi tự hỏi liệu WAR của bạn có thiếu khả năng hiển thị bộ nạp lớp vào trong ejb-jar của bạn không? Tôi nghĩ lý tưởng là 299 máy đánh chặn sẽ nằm trong lọ của chúng, có thể nhìn thấy cả EJB và các mô đun web và được kích hoạt trong cả hai tệp beans.xml của chúng.

5

Đã quá muộn, nhưng nếu ai đó vẫn gặp sự cố này. Cả hai mô-đun nên được nạp bởi cùng một trình nạp lớp để sử dụng bộ chặn trong các mô-đun khác nhau có thể, ít nhất là trong WebSphere 8b2. Trong WebSphere, cài đặt này có thể được chuyển trong bảng điều khiển quản trị: Ứng dụng> Kiểu ứng dụng> Ứng dụng WebSphere enterprise> [tên ứng dụng của bạn]> Phát hiện tải lớp và cập nhật> Chính sách trình nạp lớp WAR = Trình nạp lớp đơn cho ứng dụng.
Trình chặn phải chỉ được bật ONCE trong beans.xml.

+0

Nó không bao giờ trễ cho câu trả lời đúng, thx :-) –

+2

Thậm chí nếu nó được phép (và phổ biến) trong WebSphere, điều này không được khuyến khích cho ứng dụng JEE. Trình tải lớp là riêng biệt vì một lý do. –

0

Tôi có cùng một vấn đề với JBoss AS 6.0/6.1 (bản dựng hàng đêm) và sửa nó theo disabling separate classloaders (tùy chọn 1), nhưng cực kỳ cẩn thận với điều này. Việc tách classloaders chưa được giới thiệu mà không có lý do, vì vậy rõ ràng là có những vấn đề mới trên con đường phía trước ...

This là báo cáo jira, hãy bỏ phiếu nó lên :-)

8

J2EE 7 đặc điểm kỹ thuật nói (reference):

Bộ chặn mà bạn chỉ định trong tệp beans.xml chỉ áp dụng cho các lớp trong cùng một kho lưu trữ. Sử dụng các chú thích @Priority để xác định chặn trên toàn cầu cho một ứng dụng bao gồm nhiều module

Giải pháp này có lợi thế là nhà cung cấp độc lập.

Một thí dụ:

@Logged 
@Interceptor 
@Priority(Interceptor.Priority.APPLICATION) 
public class LoggedInterceptor implements Serializable { ... } 
+0

Tôi có thể xác nhận điều này hoạt động trên WildFly 10.1.0.Final – schnatterer

0

Tôi có chính xác cùng một vấn đề với logging interceptor tôi trên JBoss 7 và cố định nó bằng cách đè jar hoàn tất các đánh chặn của vào ứng dụng.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <overlays> 
        <overlay> 
         <groupId>com.github.t1</groupId> 
         <artifactId>logging-interceptor</artifactId> 
         <type>jar</type> 
         <targetPath>WEB-INF/classes</targetPath> 
        </overlay> 
       </overlays> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 
    <dependency> 
     <groupId>com.github.t1</groupId> 
     <artifactId>logging-interceptor</artifactId> 
     <version>1.1</version> 
     <optional>true</optional> 
    </dependency> 
</dependencies> 

Bạn vẫn sẽ phải kích hoạt trình chặn trong ứng dụng breans.xml.

Không đẹp, nhưng nó hoạt động. Trong Java EE 7, nó hoạt động mà không cần kích hoạt bằng cách chú thích trình chặn chặn là @Priority.

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