2011-09-23 23 views
5

Tôi gặp sự cố lạ với phương thức PropertyUtils.getProperty(bean, fieldName), trong đó tôi nhận được java.lang.NoShuchMethodException.PropertyUtils.getProperty không thành công khi cố gắng lấy giá trị thuộc tính đơn giản

Giả sử chúng ta có một lớp đơn giản java gọi POJO:

public class Pojo { 
    public java.util.Date aDate; 
    public java.util.Date theDate; 

    public Pojo(){} 
} 

và một lớp người gọi như

public class TestPojo{ 
    public static void main(String[] args){ 
     Pojo p = new Pojo(); 
     p.setADate(new Date()); 
     p.setTheDate(new Date()); 

     PropertyUtils.getProperty(p, "theDate"); 
     PropertyUtils.getProperty(p, "aDate"); 
    } 
} 

Các PropertyUtils.getProperty cuộc gọi đầu tiên hoạt động tốt, và điều thứ hai sẽ throw các NoSuchMethodExeption.

Tôi muốn biết nếu tôi là thiếu một cái gì đó ngu ngốc hay nó thực sự là một lỗi :)

+0

'PropertyUtils' là gì? Nó không phải là một lớp Java tiêu chuẩn. – Jesper

+0

Gọi PropertyUtils.getProperty (p, "ADate"); hoạt động tốt: o – nadouani

+0

org.apache.commons.beanutils.PropertyUtils của nó từ các bean thông thường – nadouani

Trả lời

4

Tôi không hiểu cách PropertyUtils.getProperty(p, "TheDate"); có thể hoạt động vì tên của thuộc tính không chính xác.

Hãy thử điều này:

public class TestPojo{ 
    public static void main(String[] args){ 
     Pojo p = new Pojo(); 
     p.setADate(new Date()); 
     p.setTheDate(new Date()); 

     PropertyUtils.getProperty(p, "theDate"); 
     PropertyUtils.getProperty(p, "aDate"); 
    } 
} 

Liên kết với các PropertyUtils method

Để Giải quyết các vấn đề của bạn, hai giải pháp:

  • sử dụng tên tài sản "ADate" thay vì
  • thay đổi phương pháp accessors của bạn tên để getaDate() và setaDate (Ngày dateToSet)

Như Xavi nói nó là một reported bug

+1

bạn nói đúng, đó chỉ là lỗi đánh máy, tôi đã chỉnh sửa câu hỏi :) – nadouani

+2

@Fred +1 Cảm ơn tín dụng của bạn, nhưng nó không chính xác là một lỗi. Đó là hành vi của [java.beans.Introspector] (http://java.sun.com/j2se/1.5.0/docs/api/java/beans/Introspector.html), theo [Đặc tả của Java Beans] (http : //java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html), do đó các tên được sử dụng để truy cập các thuộc tính có nguồn gốc từ các phương thức getter/setter cho dù thuộc tính có tên trong hạt đậu. Tiêu chuẩn quy định rằng chữ cái đầu tiên sẽ được chuyển thành chữ thường ** trừ ** nếu hai ký tự đầu tiên là chữ hoa. Trong trường hợp này tên vẫn không thay đổi. –

+1

@Fred Xin lỗi vì tất cả những phiền phức, nhưng bạn biết đấy, khi [gọi nhiệm vụ] (http://xkcd.com/386) ... –

1

Hãy thử

PropertyUtils.getProperty(p, "ADate"); 

thay vì

PropertyUtils.getProperty(p, "aDate"); 
+0

ok, nhưng "ADate" không phải là tên của trường Pojo. – nadouani

2

Có thể bạn cần sử dụng:

PropertyUtils.getProperty(p, "ADate"); 

trong đó A in UP PERCASE

+0

getters và setters [link] (http://stackoverflow.com/questions/2036970/tutorial-on-getters-and-setters) – Ankar

6

Hãy xem này bug report

Java Bean Đặc điểm kỹ thuật quốc gia trong phần "8.8 Vốn của tên suy ra" rằng khi ký tự đầu tiên được chuyển thành chữ thường trừ khi hai ký tự đầu tiên là chữ hoa, sau đó tên thuộc tính là "không đổi".

Thích ứng với phần còn lại cho bạn (trong nghiêng):

Vì vậy, khi bạn có một phương pháp getter tên "getADate" này được dịch sang tên tài sản "ADate" và không phải "aDate".

Vì vậy, để giải quyết vấn đề của bạn, bạn có hai lựa chọn:

  • sử dụng tên tài sản "ADate" thay hoặc
  • thay đổi mà bạn phương pháp tên để "getaDate" "setaDate"
+0

Tôi nghĩ mình đã tìm thấy một BUG bên trong commons -beanutils và nó là quy ước đặt tên (trong trường hợp của tôi tài sản của tôi được gọi là "xPos") –

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