Anyway to pass a constructor parameter to a JAXB Adapter? Anyway to pass a constructor parameter to a JAXB Adapter? spring spring

Anyway to pass a constructor parameter to a JAXB Adapter?


I'm not sure how you hook this in with Spring, but below is a description of the JAXB mechanism that you can leverage.

If you have the following:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=RoundingAdapter.class,type=java.math.BigDecimal.class)

Then using the standalone JAXB APIs you could do the following. The code below means whenever the RoundingAdapter is encountered, the specified instance should be used.

marshaller.setAdapter(new RoundingAdapter(4));unmarshaller.setAdapter(new RoundingAdapter(4));

For More Information


Usage

import com.company.BigDecimalAdapter.X$XXXX;...@XmlElement(name = "QTY")@XmlJavaTypeAdapter(X$XXXX.class)private BigDecimal quantity;

BigDecimalAdapter

import static java.math.RoundingMode.HALF_UP;import java.math.BigDecimal;import java.text.DecimalFormat;import javax.xml.bind.annotation.adapters.XmlAdapter;public class BigDecimalAdapter extends XmlAdapter<String, BigDecimal> {    public static final class X$XX extends BigDecimalAdapter {        public X$XX() {            super("#.##");        }    }    public static final class X$00 extends BigDecimalAdapter {        public X$00() {            super("#.00");        }    }    public static final class X$XXXX extends BigDecimalAdapter {        public X$XXXX() {            super("#.####");        }    }    private final ThreadLocal<DecimalFormat> format;    public BigDecimalAdapter(String pattern) {        format = ThreadLocal.withInitial(() -> {            DecimalFormat df = new DecimalFormat(pattern);            df.setRoundingMode(HALF_UP);            return df;        });    }    @Override    public String marshal(BigDecimal v) throws Exception {        return format.get().format(v);    }    @Override    public BigDecimal unmarshal(String v) throws Exception {        return new BigDecimal(v);    }}