2012-04-10 34 views
15

Tôi có một servlet, thông qua các tham số truy vấn, nhận danh sách các đối tượng từ DAO, chuyển danh sách thành JSON và gửi nó trở lại trong phản hồi. Mỗi danh sách được làm bằng vật thể có một phương pháp:Làm cách nào bạn có thể chuyển Danh sách <đối tượng triển khai giao diện> sang phương thức?

public String getAsJson(){...} 

Và servlet có một loạt các phương pháp chủ yếu là indentical trông giống như:

private String getUserListAsJson() { 
    List<User> userList = this.dao.getUsers(); 
    StringBuilder builder = new StringBuilder(); 
    builder.append('['); 
    // loops over the list appending the value of each objects getAsJson() 
    builder.append(']'); 
    return builder.toString(); 
} 

Vấn đề là tôi có khoảng 6 phương pháp (và đang phát triển) trông giống hệt như vậy ngoại trừ các truy vấn DAO khác nhau. Ý tưởng của tôi là tạo một giao diện chỉ có định nghĩa cho phương thức getAsJson(), làm cho mỗi bean thực hiện điều đó, và sau đó có một phương thức khác trong servlet lấy các đối tượng đã thực hiện giao diện đó. Đã kết thúc tìm kiếm như thế này:

public Interface JsonEnabled { 
    public String getAsJson(); 
} 

public class User implements JsonEnabled { 
    .... 
    @Override 
    public String getAsJson() {...} 
} 

public class TheServlet { 
    ... 
    private String getUserListAsJson() { 
     List<User> userList = this.dao.getUsers(); 
     return this.getListAsJson(userList); 
    } 
    private String getListAsJson(List<? implements JsonEnabled> list) { 
     // The loop code that is in each method. 
    } 
} 

Vì vậy, nếu có ai đã thực sự đọc đến đây = P, điều đó không biên dịch và sau khi nhìn lên một số tài liệu từ Oracle, bạn chỉ có thể có kéo dài và không thực hiện cho các thông số chung. Làm cho tất cả các lớp mở rộng từ một lớp trừu tượng mà chỉ có phương thức getAsJson() không có ý nghĩa ngữ nghĩa (các lớp không liên quan).

Tôi chưa tìm thấy giải pháp tốt về SO hoặc chỉ googling xung quanh, vì vậy mọi trợ giúp/thông tin chi tiết sẽ được đánh giá cao.

+1

nhưng bạn có thực sự muốn tự xây dựng chuỗi JSON không? Đề xuất sử dụng thư viện như Jackson hoặc một cái gì đó khác –

Trả lời

36

Đối với các kí hiệu chung từ khóa extends công trình cho cả lớp và các giao diện:

private String getListAsJson(List<? extends JsonEnabled> list) { ... } 

extends có ý nghĩa hơi khác nhau khi được sử dụng để xác định giới hạn chung - đó là về cơ bản dịch để "được, hoặc kéo dài, hoặc dụng cụ".

+0

Cảm ơn bạn! Điều này làm việc như một say mê. Tôi nghĩ rằng phải có một cách để làm điều này - đoán tôi nên đọc tài liệu một lần nữa ngay bây giờ mà bạn đã giải thích nó và xem liệu các tài liệu nói cùng một điều. – Windle

+0

Tôi ước tôi có thể cung cấp cho rất nhiều + 1s Đây chính xác là những gì tôi cần, và bây giờ tôi hiểu ý nghĩa của nó. – reidisaki

3

Tại sao không chỉ cần sử dụng

private String getListAsJson(List<JsonEnabled> list) { ... } 

?

+3

Dựa vào mẫu mã OP, bạn không được chuyển tham số 'Danh sách ' vào hàm đó. –

+1

@LuiggiMendoza đóng đinh nó. Cảm thấy như nếu tôi sẽ đi qua những rắc rối của đúc mỗi danh sách vào một danh sách Tôi cũng có thể chỉ cần làm JSON ở đó. Tôi cũng có suy nghĩ tương tự. – Windle

+0

@LuiggiMendoza Tôi hiểu, cảm ơn. Có vẻ như tôi đã bỏ lỡ điểm này. Tuy nhiên bạn vẫn có thể tạo Danh sách và điền nó với Người dùng và sau đó vượt qua nó quá phương pháp như vậy. –

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