JAXB не вызывает setter при демаршировании объектов - PullRequest
9 голосов
/ 22 апреля 2010

Я использую JAXB 2.0 JDK 6, чтобы демонтировать экземпляр XML в POJO.

Чтобы добавить некоторую настраиваемую проверку, я вставил вызов проверки в установщик свойства, но, несмотря на то, что он является закрытым, кажется, что unmarshaller не вызывает установщик, а напрямую изменяет приватное поле.

Для меня крайне важно, чтобы пользовательская проверка выполнялась для этого конкретного поля при каждом вызове unmarshall.

Что мне делать?

Код:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LegalParams", propOrder = {
    "value"
})
public class LegalParams {

    private static final Logger LOG = Logger.getLogger(LegalParams.class);

    @XmlTransient
    private LegalParamsValidator legalParamValidator;

    public LegalParams() {

        try {
            WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
            LegalParamsFactory legalParamsFactory = (LegalParamsFactory) webApplicationContext.getBean("legalParamsFactory");
            HttpSession httpSession = SessionHolder.getInstance().get();
            legalParamValidator = legalParamsFactory.newLegalParamsValidator(httpSession);
        }
        catch (LegalParamsException lpe) {
            LOG.warn("Validator related error occurred while attempting to construct a new instance of LegalParams");
            throw new IllegalStateException("LegalParams creation failure", lpe);
        }
        catch (Exception e) {
            LOG.warn("Spring related error occurred while attempting to construct a new instance of LegalParams");
            throw new IllegalStateException("LegalParams creation failure", e);
        }
    }

    @XmlValue
    private String value;

    /**
     * Gets the value of the value property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getValue() {
        return value;
    }

    /**
     * Sets the value of the value property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     * @throws TestCaseValidationException
     *
     */
    public void setValue(String value) throws TestCaseValidationException {
        legalParamValidator.assertValid(value);
        this.value = value;
    }
}

1 Ответ

14 голосов
/ 22 апреля 2010

JAXB использует доступ к полю, потому что вы настроили его для использования доступа к полю, пометив поле с помощью @XmlValue и объявив @XmlAccessorType(XmlAccessType.FIELD).

Чтобы использовать доступ к свойству, вы можете переместить @XmlValue либо к получателю, либо к установщику (@XmlAccessorType вообще не требуется).

...