2009-11-29 25 views
6

Tôi đang làm việc trên một ứng dụng Spring với nhiều hình thức đầu vào. Tôi muốn sử dụng lại độ dài trường trong các biểu mẫu UI, xác thực và JPA. Có cách nào thanh lịch để giải quyết vấn đề này không. Giải pháp của tôi vào lúc này là, sử dụng các hằng số để khai báo độ dài:Làm thế nào để tái sử dụng fieldlength dưới dạng, xác thực và ddl?

public class Person 
{ 
    public static final int FIRSTNAME_LENGTH = 25; 

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

và sau đó tái sử dụng liên tục trong Validator và JSP

... 

<form:input path="firstName" 
    maxlength="<%= Integer.toString(Person.FIRSTNAME_LENGTH) %>"/> 

... 

mà là khá dài dòng.

Có giải pháp thanh lịch nào khác cho vấn đề này không?

+0

có vẻ ổn với tôi. – pstanton

+0

Dominik, giải pháp "thanh lịch" của bạn trông khá thông minh với tôi. Tôi có thể phải sử dụng nó. Câu hỏi hay, không quan tâm, đây là điều mà mọi người phải làm nhưng dường như không có giải pháp cho nó. –

+0

Tôi vui vì bạn đã đặt một khoản tiền thưởng ở đây, tôi cũng muốn thấy câu trả lời này được trả lời. Tôi ước họ có một tính năng cho tiền thưởng cộng đồng, tôi sẽ ném vào một số đại diện của tôi. –

Trả lời

10

Bạn hoàn toàn có thể truy cập thông tin được lưu trữ trong chú thích. Trong thực tế, đây là mục đích chính của chúng: lưu trữ thông tin meta trên một lớp/phương thức/trường. Dưới đây là một ví dụ về cách truy cập vào độ dài lưu trữ trong một chú thích @column:

import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
public class Person { 

    @Column(length=30) 
    private String firstName; 

    public static void main(String[] args) throws SecurityException, NoSuchFieldException { 
     Object person = new Person(); 
     //find out length  
     System.out.println(person.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length()); 
    } 
} 

Bạn sẽ có thể tạo ra một số thẻ tùy chỉnh hoặc đậu để trích xuất thông tin này quát.

Không khó để tạo chú thích của riêng bạn. Bạn có thể xem xét việc tạo ra một trong đó xác định các lĩnh vực sẽ được bao gồm trên biểu mẫu, làm thế nào họ nên được trả lại, mô tả, vv Hơn bạn có thể tạo ra một hình thức chung chung. Sau đó, một lần nữa bạn có thể không muốn trộn tên miền và bản trình bày.

+0

Đó là một dòng khá đầy đủ, sự nổi tiếng Java nổi tiếng là sống động và tốt. Lời khuyên tuyệt vời, cảm ơn bạn. –

+0

Chỉ cần theo dõi, java.lang.Class.getDeclaredField() ném hai ngoại lệ đã kiểm tra, NoSuchFieldException và SecurityException. Điều này làm cho phương thức này trở nên khó khăn hơn một chút và là điều cần ghi nhớ nếu bạn đang cố gắng thực hiện giải pháp này. –

1

Tôi hỏi một câu hỏi tương tự khi tôi đã sử dụng Hibernate,

Getting column length from Hibernate mappings?

Không có ý tưởng làm thế nào để lấy thông tin này theo JPA tuy nhiên, nhưng nếu bạn đang sử dụng Hibernate như lớp cơ bản của bạn, bạn có thể thử truy cập trực tiếp Hibernate và triển khai giải pháp trên.

Tuy nhiên, giải pháp Hibernate cũng giống như giải pháp mà bạn đã nêu trong câu trả lời của bạn, với bất lợi thêm rằng nó liên quan đến việc triển khai JPA của bạn thành Hibernate.

0

Giải pháp được cung cấp bởi EJB lần đọc giá trị chú thích cho độ dài cột. James McMahon chỉ ra rằng điều này cho thấy việc thực hiện Hibernate. Điều đó có thể được giải quyết khá đơn giản với các phương thức getter. Giả sử có giao diện cho Người có phương thức được khai báo getFirstNameLength:

import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
public class PersonImplementation extends Person { 

    @Column(length=30) 
    private String firstName; 

    public int getFirstNameLength() { 
     return this.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length(); 
    } 
} 
Các vấn đề liên quan