2010-04-22 71 views
9

我正在使用JAXB 2.0 JDK 6將XML實例解組到POJO中。解組對象時,JAXB不調用setter

爲了添加一些自定義驗證,我將驗證調用插入到屬性的setter中,但儘管它是私有的,但似乎unmarshaller不會調用setter,而是直接修改私有字段。

對於我而言,每次取消編組調用都會針對此特定字段進行自定義驗證,這一點至關重要。

我該怎麼辦?

代碼:

@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; 
    } 
} 

回答

13

JAXB採用現場訪問,因爲您配置它通過註釋字段與@XmlValue並通過聲明@XmlAccessorType(XmlAccessType.FIELD)採用現場訪問。

要使用財產訪問,您可以將@XmlValue移動到獲取者或設置者(根本不需要@XmlAccessorType)。

+0

謝謝你的訣竅:) – Yaneeve 2010-04-22 11:43:59