2009-05-13 42 views
6

có ai biết cách đặt giá trị không đổi vào một thuộc tính với dozer không? Tôi không thấy bất cứ điều gì về điều đó trong tài liệu của dozerHằng số trong ánh xạ dozer

Trả lời

3

Không hoàn toàn chắc chắn ý của bạn - nếu bạn muốn Dozer luôn cư trú BeanB.someField với hằng số bất cứ khi nào bạn ánh xạ từ BeanA sang BeanB?

Bạn có thể muốn đăng ký custom converter cho bản đồ này.

+0

Vâng, đó là chính xác những gì tôi muốn. Tôi đã tự hỏi nếu nó có thể làm điều đó trực tiếp mà không có một công cụ chuyển đổi tùy chỉnh. –

+0

Thanx cho câu trả lời, bằng cách này. –

+0

Tôi tin rằng phương pháp duy nhất của bạn là sử dụng một chuyển đổi tùy chỉnh hoặc để làm điều đó bằng tay khi bạn gọi Dozer. Dozer chỉ thực sự xử lý ánh xạ từ bean này sang bean khác, và không cung cấp cho bạn nhiều chỗ để chèn logic khác (có ý nghĩa, vì nó không có nghĩa là làm điều đó). –

2

Làm thế nào để tận dụng cơ chế sự kiện?

Vì vậy, bạn có thể đăng ký người nghe sẽ thực hiện cài đặt giá trị trong mappingFinished() của người nghe của bạn. Tham khảo dozer doc on events để biết chi tiết. Tất nhiên bạn sẽ phải bảo vệ mã cài đặt với một số loại điều kiện if ... instanceof.

+0

Điều này làm việc thực sự tốt cho tôi, mặc dù tôi đặt móc vào 'preWritingDestinationValue', vì vậy các giá trị hoạt động như mặc định, thay vì ghi đè những gì đã được ánh xạ. – tzrlk

1

Các công cụ xây dựng dozer gần đây giúp việc này trở nên dễ dàng hơn. Bạn có thể chỉ định cả hai trình biến đổi tùy chỉnh bạn có thể chỉ định tham số cho trình chuyển đổi đó cho một ánh xạ trường đã cho. Nó sẽ là tầm thường để tạo ra một 'ConstantConverter' duy nhất sẽ lấy một tham số đầu vào và đặt nó trong trường đầu ra 100% thời gian.

+1

Trên thực tế nó không phải là dễ dàng với chuyển đổi tùy chỉnh. Bạn sẽ cần phải viết một trình biến đổi cho toàn bộ lớp chứa trường (đánh bại mục đích sử dụng dozer ở vị trí đầu tiên) hoặc khỉ xung quanh với các giải pháp xấu để đính kèm bộ chuyển đổi vào một trường duy nhất (và trường đó chỉ tồn tại trên một trường) của các lớp). Nó có thể là một cách tiếp cận tốt trong một số trường hợp mặc dù (tùy thuộc vào cách các đối tượng của bạn được cấu trúc). – Lajcik

0

này là khá đơn giản với ModelMapper:

ModelMapper modelMapper = new ModelMapper(); 

modelMapper.addMappings(new PropertyMap<SourceClass, DestClass>() { 
    protected void configure() { 
    map().setSomeProperty(someConstant); 
    } 
}); 

Ví dụ này maps someConstant-DestClass.someProperty.

Bạn có thể kiểm tra thêm các ví dụ và tài liệu tại địa chỉ: http://modelmapper.org

0

Một thực thể là:

public class ConstantsCustomConvertor implements ConfigurableCustomConverter{ 

    private String pararamter; 
    @Override 
    public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) {  
     return pararamter; 
    } 

    @Override 
    public void setParameter(String parameter) { 
     this.pararamter = parameter; 

    } 
} 

Ví dụ:

<field custom-converter-param="CONTANT_VALUE" custom-converter="org.yourcompany.ConstantsCustomConvertor"> 
    <a>a-class-dummyfieldname</a> 
    <b>b-class-fieldname</b> 
</field>  

này Tuỳ chỉnh Convertor là giả định rằng các b-lớp -fieldname là loại String.

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