2011-11-21 23 views
5

Tôi gặp khó khăn trong việc viết một quy tắc phù hợp với giá trị enum trong lhs của nó.Drools: Làm thế nào để sử dụng một enum trong lhs của một quy tắc?

Ví dụ, nếu tôi có enum sau:

public enum EStatus { 
    OK, 
    NOT_OK 
} 

Tôi muốn sử dụng nó trong một cái gì đó như thế này:

rule "my rule" 
dialect "java" 
    when   
     status : EStatus()      // --> this works, but I want to be more specific 
     // status : EStatus(this == EStatus.OK) // --> doesn't work. How can I make it work? 
    then 
     // ... 
end 

Đây có phải là thậm chí có thể ở Drools? Tôi sử dụng phiên bản 5.1.1.

Trả lời

6

này làm việc cho tôi:

rule "my rule" 
when 
    Ticket(status == EStatus.OK) 
then 
    ... 
end 

để nên làm việc quá:

rule "my rule" 
when 
    EStatus(this == EStatus.OK) 
then 
    ... 
end 

Xác minh nếu nó vẫn xảy ra ở Drools 5.3 và nộp một lỗi nếu có trong jira

+0

Cảm ơn vì đã chỉ nó ra. Bây giờ nó cũng làm việc cho tôi. Thật lạ lùng, bởi vì tôi đã xác minh nhiều lần vấn đề trước khi đăng nó ở đây. Cái gì đó có thể xảy ra nhất ... – Calin

0

Tôi đã cố gắng sử dụng Enum trên LHS [Ticket (status == EStatus.OK)], tôi nhận được lỗi biên dịch thời gian như sau:

BuildError: Không thể phân tích tình trạng biểu == EStatus.OK Lỗi: không thể giải quyết phương pháp sử dụng nghiêm ngặt chế độ: ....

Giải pháp:

Trong LHS quy tắc, chúng ta phải so sánh với giá trị Hằng số ... ví dụ: người dùng: Người dùng (tuổi> 60) - ở đây chúng tôi so sánh độ tuổi với Giá trị không đổi 60.

Vì vậy, để sử dụng Enum, Ticket (status == EStatus.OK) ... Tôi đã phải sử dụng một số liên tục thay cho EStatus.OK để so sánh điều này với trạng thái. Vì lý do này, tôi đã sử dụng một phương pháp tĩnh trong Enum.

Vì vậy, các LHS cai trị bây giờ trông giống như: vé (status == EStatus.getEStatus (1))

và EStatus enum là như sau:

enum công EStatus {

// you can use values other than int also 
OK(1), 
ERROR(2); 

private int value; 

EStatus (số int) { this.value = number; }

public int valueOf() 
{ 
    return this.value; 
} 

public static EStatus getEStatus(int value){ 
    EStatus eStatus = null; 

    for(EStatus e : EStatus.values()){ 
     if(e.valueOf() == value){ 
      eStatus = d; 
      break; 
     } 
    } 

    return eStatus; 
} 

}

Tôi đã thử nghiệm này sử dụng jdk 1.6 và cả Linux và môi trường Windows.

Tận hưởng mã hóa!

0

Một giải pháp khác. Bạn chỉ cần thêm getter vào Estatus enum như dưới đây.

public enum EStatus { 
OK, 
NOT_OK; 

public EStatus getValue(){ 
    return this; 
} 

}

Sau đó, bạn có thể viết quy tắc như sau

rule "my rule" 
when 
    EStatus(value == EStatus.OK) 
then 
    ... 
end 
Các vấn đề liên quan