2010-06-04 37 views
18

Có cách nào dễ dàng để biến đầu vào biểu mẫu trống thành các chuỗi rỗng trong java không? Tôi đang sử dụng mvc mùa xuân và SimpleJdbcInsert để chèn đối tượng vào cơ sở dữ liệu MySQL. Tôi muốn đặt đầu vào trống thành NULL trong cơ sở dữ liệu thay vì ''. Tôi có khá một vài lĩnh vực, và tôi hy vọng một cách để làm điều này mà không cần kiểm tra mọi giá trị một cách thủ công.Có cách nào dễ dàng để biến đầu vào biểu mẫu Java/Spring trống thành các chuỗi rỗng không?

Cảm ơn!

chỉnh sửa - Vì vậy, tôi là kẻ ngốc. Một số lỗi kết hợp trên một phần của tôi đã khiến tôi tin rằng các câu trả lời đúng dưới đây là không chính xác. Tôi đã viết một propertyEditorSupport như thế này:

class StringEditor extends PropertyEditorSupport { 
    public void setAsText(String text) { 
     String value = text.trim(); 
     if ("" == value) { 
      setValue(null); 
     } 
     else { 
      setValue(value); 
     } 
    } 
} 

Hai vấn đề - đầu tiên, không getAsText, vì vậy biểu mẫu của tôi đã được điền bằng các chuỗi "null"! 2, kiểm tra bình đẳng của tôi là C + +, không phải java. Khi tôi cố gắng setter đề nghị, tôi chỉ cần tải lại các bài, trong đó đã có các chuỗi "null". Khi tôi dọn dẹp tất cả mọi thứ, mọi thứ bắt đầu hoạt động. Cảm ơn sự giúp đỡ, và xin lỗi cho "lỗi nhà điều hành" của tôi!

Brett

Trả lời

47

Lớp bạn đang tìm kiếm là:

org.springframework.beans.propertyeditors.StringTrimmerEditor 

Nếu bạn xây dựng nó với true, nó sẽ chuyển đổi các chuỗi trống/khoảng trắng thành rỗng. Làm thế nào để đăng ký nó vào binder phụ thuộc vào nếu bạn muốn nó là mặc định hoặc chỉ áp dụng cho các khung nhìn nhất định.

ví dụ, trên một bộ điều khiển duy nhất bạn có thể chỉ cần thêm

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 
} 

instructions here

+0

Xem nhận xét của tôi về Bozho về registerCustomEditor không hoạt động trong Spring 2.5.5 –

+0

Vâng, tôi không thể thề trên 2.5.5, nhưng tôi khá chắc chắn trên 2.5.6 và 3 rằng nó đặt chuỗi tham chiếu null, nó không đặt chuỗi có giá trị là "null". Có lẽ nếu bạn đã thêm mã vi phạm vào câu hỏi của mình, chúng tôi có thể trợ giúp thêm? – Affe

+0

Xem bản chỉnh sửa của tôi cho bài đăng gốc. Xấu của tôi, cảm ơn sự kiên nhẫn của bạn. –

0

Thiết lập giá trị mặc định cho các lĩnh vực tùy chọn của bạn để NULL - thực sự là nó không phải là NULL theo mặc định?

Phân tích chuỗi đầu vào của bạn và sau đó định rõ các cột chỉ dân cư với

usingColumns 

oh, và tôi muốn khuyên để luôn luôn khử trùng đầu vào của bạn ...

+0

Tâm trí cho tôi biết cách đặt giá trị mặc định thành NULL?Tôi nhận được chuỗi rỗng trở lại, vì vậy tôi đoán NULL không phải là mặc định. –

+0

Tôi nghĩ rằng đó là mặc định, nhưng bạn cũng có thể thêm một mệnh đề DEFAULT NULL rõ ràng cho mỗi trường. http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html NB - Lưu ý strikethru của tôi - Tôi đọc phần này bên ngoài ngữ cảnh của lớp SimpleJdbcInsert – blissapp

+0

Ok, tôi có NULL mặc định cho cơ sở dữ liệu. Tôi nghĩ bạn đang đề cập đến một cách để thiết lập null là kết quả chuỗi java mặc định cho đầu vào trống trên biểu mẫu! Các vấn đề với usingColumns (tôi nghĩ) là nó cần (String ...) như là các đối số - Tôi cần phải hardcode chúng, không tạo ra một danh sách các đối số chuỗi động tại thời gian chạy bằng cách kiểm tra các giá trị. Tôi cũng có thể có các getters trả về null cho các chuỗi rỗng, mà có vẻ tương đương, nhưng một lần nữa có nghĩa là kiểm tra mọi giá trị. –

2

lẽ bạn có thể sử dụng một custom Binder

+0

Tôi đã thử điều đó, nhưng nó trả về một String. Cố gắng setValue (null) để lại cho tôi với Strings == "null" (từ bốn chữ "null", không phải là giá trị null). Không hoàn toàn những gì tôi đang tìm kiếm! –

+0

bạn không thể trả về 'null' String? – Bozho

+0

Tùy chỉnh chất kết dính là đúng. Nơi bạn thấy điều này 'Strings ==" null "'; bạn đang làm gì đấy? Bạn đang xây dựng một chuỗi SQL, nếu có DONT. Sử dụng một Preprable. – Justin

8

Tôi biết điều này là cũ, nhưng tôi lãng phí khoảng 2 hoặc 3 giờ cho đến khi tôi tìm thấy một cách rất dễ dàng để áp dụng một StringTrimmerEditor với một chất kết dính cho tất cả các bộ điều khiển của tôi.

Một lần nữa: Tôi phải nhớ RTFM.

Vào mùa xuân 3.2, bạn có thể tạo một lớp điều khiển @ControllerAdvice-được kiểm soát và sử dụng phương thức @InitBinder-đã được báo cáo giống như ví dụ @Affe đã cung cấp.

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-initbinder-advice

Dưới đây là một ví dụ:

@ControllerAdvice 
@Controller 
public class AppBindingInitializer { 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); 
    } 

} 

Hy vọng nó sẽ giúp một ai đó.

+0

Cảm ơn bạn đã chia sẻ. –

+0

Câu trả lời hay nhất tôi tìm thấy bao gồm tất cả các câu hỏi liên quan đến SO mà tôi đã tìm thấy! – NickGreen

+0

Tại sao bạn cần chú thích '@ Controller' và' @ ControllerAdvice' trên cùng một bean? – naXa

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