2014-05-16 18 views
8

Tôi thực sự bị mắc kẹt khi cố gắng ánh xạ các tham số QueryString vào đối tượng Lệnh JavaBean Spring tại đây và tôi không thể tìm thấy câu trả lời câu hỏi của tôi cho đến nay.Không thể ánh xạ các tham số chuỗi truy vấn tới JavaBean của tôi (sử dụng Spring 4 và Datatables)

Tôi đang sử dụng plugin jQuery Datatables với server side processing để mỗi hành động trong dữ liệu của tôi, kích hoạt yêu cầu AJAX cho ứng dụng Spring của tôi.

Đây là các thông số plugin DataTable được gửi đến dịch vụ nghỉ ngơi của tôi:

http://localhost:8080/relatorios/produtos-source?draw=2&columns[0][data]=nome&columns[0][name]=&columns[0][searchable]=true&columns[0][orderable]=true&columns[0][search][value]=&columns[0][search][regex]=false&columns[1][data]=nomesAlternativos&columns[1][name]=&columns[1][searchable]=true&columns[1][orderable]=true&columns[1][search][value]=&columns[1][search][regex]=false&order[0][column]=2&order[0][dir]=asc&start=0&length=10&search[value]=ss&search[regex]=false&_=1400248561282 

Đây là cách tôi nhận được nó trong điều khiển Mùa xuân của tôi:

@RequestMapping(value = "/produtos-source", method = RequestMethod.GET) 
@ResponseStatus(HttpStatus.OK) 
@ResponseBody 
public ProdutoTable dataTableRequest(@ModelAttribute DataTableCriterias criterias) { 
    ... 
} 

Và cuối cùng, đây là của tôi DataTableCriterias JavaBean (thể hiện bằng @ModelAttribute):

public class DataTableCriterias { 
    private int draw; 
    private int start; 
    private int length; 

    private Map<SearchCriterias, String> search; 

    private List<Map<OrderCriterias, String>> order; 

    private List<Column> columns; 

    public enum SearchCriterias { 
     value, 
     regex 
    } 

    public enum OrderCriterias { 
     column, 
     dir 
    } 

    public class Column { 
     private String data; 
     private String name; 
     private boolean searchable; 
     private boolean orderable; 
     private Map<SearchCriterias, String> search; 
    } 
} 

(get/setters ommited)

Điều này gần như hoạt động hoàn hảo! Nếu tôi loại bỏ dòng này:

private List<Column> columns; 

rồi mùa xuân Automagically populates đậu DataTableCriterias tôi từ chuỗi truy vấn (nhưng tất nhiên, tôi không nhận được các cột tài sản ánh xạ)

Nhưng với dòng này nói thêm, tôi nhận được lỗi này:

2014-05-16 17:20:16.605 ERROR 2368 --- [tomcat-http--99] o.a.c.c.C.[.[.[.[dispatcherServlet]  : Servlet.service() for servlet [dispatcherServlet] in context with path [/relatorios] threw exception [Request processing failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'columns[0][data]' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Illegal attempt to get property 'columns' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'columns' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Could not instantiate property type [com.bergermobile.rest.domain.DataTableCriterias$Column] to auto-grow nested property path: java.lang.InstantiationException: com.bergermobile.rest.domain.DataTableCriterias$Column] with root cause 

org.springframework.beans.NullValueInNestedPathException: Invalid property 'columns' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Could not instantiate property type [com.bergermobile.rest.domain.DataTableCriterias$Column] to auto-grow nested property path: java.lang.InstantiationException: com.bergermobile.rest.domain.DataTableCriterias$Column 
    at org.springframework.beans.BeanWrapperImpl.newValue(BeanWrapperImpl.java:651) 

Như tôi đã nhìn thấy nó, vấn đề chính là các tham số 'cột' gửi bởi plugin DataTable là một hai chiều và đôi khi cũng là một mảng tridimensional:

columns[0][data]=nome 
columns[0][search][regex]=false 

Vì vậy, có vẻ như Bean của tôi đã chính xác, nhưng tôi gặp phải lỗi này và giờ tôi đã bị kẹt.

Bất kỳ ý tưởng nào?

Cảm ơn rất nhiều!

Trả lời

14

Ok, vì vậy tôi đã kết thúc khắc phục sự cố này với việc sửa đổi một chút thông số được gửi tới máy chủ, để chuyển đổi hai mảng cột 3D thành một mảng 2D.Vì vậy:

columns[0][search][value]=myvalue 
columns[0][search][regex]=false 

đã kết thúc hạnh phúc:

columns[0][searchValue]=myvalue 
columns[0][searchRegex]=false 

Đây là cách để làm điều đó trong Databables:

$('#produtosTable').DataTable({ 
    serverSide: true, 
    ajax: { 
     "url": "produtos-source", 
     "data": function(data) { 
      planify(data); 
     } 
    } 
}); 

function planify(data) { 
    for (var i = 0; i < data.columns.length; i++) { 
     column = data.columns[i]; 
     column.searchRegex = column.search.regex; 
     column.searchValue = column.search.value; 
     delete(column.search); 
    } 
} 

Bằng cách này tôi có thể nhận được những tài sản trong đối tượng mẫu của tôi sử dụng lĩnh vực này :

private List<Map<ColumnCriterias, String>> columns; 

Chỉ cần để tham khảo, đây là điều khiển của tôi:

@RequestMapping(value = "/produtos-source", method = RequestMethod.GET) 
@ResponseStatus(HttpStatus.OK) 
@ResponseBody 
public ProdutoTable dataTableRequest(@ModelAttribute DataTableCriterias criterias) { 
    ProdutoTable produtoTable = produtosService.findProdutos(); 
    produtoTable.setDraw(criterias.getDraw()); 
    return produtoTable; 
} 

và đây là thức DataTableCriterias tôi @ModelAttriute:

public class DataTableCriterias { 
    private int draw; 
    private int start; 
    private int length; 

    private Map<SearchCriterias, String> search; 

    private List<Map<ColumnCriterias, String>> columns; 

    private List<Map<OrderCriterias, String>> order; 

    public enum SearchCriterias { 
     value, 
     regex 
    } 
    public enum OrderCriterias { 
     column, 
     dir 
    } 
    public enum ColumnCriterias { 
     data, 
     name, 
     searchable, 
     orderable, 
     searchValue, 
     searchRegex 
    } 

(nhận/setters bỏ qua)

0

Bạn gửi columns[0] làm thông số, nhưng columns không có mục nhập nào với chỉ mục 0. Trong thực tế, nó không có mục nhập nào vì nó là rỗng.

Bạn phải khởi tạo danh sách trong hàm tạo của DataTableCriterias để thực hiện công việc này. Và nó phải có đủ mục nhập cho các tham số bạn gửi.

+0

Hmm, tôi không hiểu. cột [0] không có mục nhập, đó là: cột [0] [dữ liệu] = nome cột [0] [tìm kiếm] [regex] = false Dù sao, tôi đã cố gắng thêm hàm tạo này vào lớp DataTableCriterias của tôi: DataTableCriterias công cộng() { \t \t cột = new ArrayList (); \t} Nhưng vẫn không có may mắn (lớp được tự động khởi tạo bởi Spring khi tôi nhận nó dưới dạng @ModelAttribute trong Bộ điều khiển của tôi) – Berger

+0

@Berger 'DataTableCriterias.columns' là' null'. Nó không thể có mục. – zeroflagL

2

tôi biết tôi muộn để đảng, nhưng điều này: https://github.com/darrachequesne/spring-data-jpa-datatables

là một thay thế đáng yêu để đọc dữ liệu đầu vào của bạn một cách thanh lịch. Thậm chí nếu bạn không muốn sử dụng JPA, bạn chỉ có thể sử dụng các lớp DataTablesInput và DataTablesOutput để đọc đầu vào một cách chính xác. Tôi cũng bao gồm jquery.spring-friendly.min.js cho phép Spring dễ dàng đọc các biến đến.

Nhờ một giải pháp trang nhã đẹp mắt.

+2

Bạn được chào đón! – darrachequesne

+0

Tôi đang sử dụng nó và nó tuyệt vời. Tôi đã tự hỏi làm thế nào nó có thể được mở rộng để bao gồm cả một bộ lọc phạm vi ngày. Tôi mới đến DataTables và phần khó khăn đối với tôi là thêm hai params tùy chỉnh (dateFrom, dateTo) để yêu cầu ajax. Bất kì lời đề nghị nào? – Dolfiz

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