2010-04-22 70 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