Question

I'm struggling with a mapping in Dozer. The basic structure of my classes is this:

class Foo {

    private String someString;

    public String getSomeString() {
        return someString;
    }

    public void setSomeString(String someString) {
        this.someString = someString;
    }
}

and the interesting part:

class Bar {

    // note that no field is declared

    public String[0] getSomeBarString() {
        // This returns an array where the acctually desired string is a index 0
    }

    public void setSomeBarString(String someString) {
        // stores the string otherwise
    }
}

Compensating the absence of a field and the differently named getter/setter methods was quite easy:

<mapping>
    <class-a>Foo</class-a>
    <class-b>Bar</class-b>
    <field>
        <a>someString</a>
        <b get-method="getSomeBarString" set-method="setSomeBarString">someBarString</b>
    </field>
</mapping>

From my understanding I could even omitt get-method and set-method as there is no field access by default.

My problem is that the getter is indexed and the setter isn't. I've already read about indexed property mapping but it does it both ways. Is there a way to make only one direction indexed? E.g. would get-method="getSomeBarString[0]" work?

Was it helpful?

Solution

After a night of sleep I got an idea myself. I just define two one way mappings and make one of them indexed. It also turns out indexing is defined the same way (after the property name) even if you declare a different get-method or set-method.

<mapping type="one-way">
    <class-a>Foo</class-a>
    <class-b>Bar</class-b>
    <field>
        <a>someString</a>
        <b set-method="setSomeBarString">someBarString</b>
    </field>
</mapping>

<mapping type="one-way">
    <class-a>Bar</class-a>
    <class-b>Foo</class-b>
    <field>
        <a get-method="getSomeBarString">someBarString[0]</a>
        <b>someString</b>
    </field>
</mapping>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top