为什么我在Java中使用marshaller得到一个小写字符?

时间:2017-01-04 16:17:18

标签: java xml jaxb marshalling

我正在尝试编组特定数据来格式化XML文档。我正在使用这个功能:

public String marshall(EntiteDynamiqueWrapper wrap) throws DocthequeException {
    JAXBContext jaxbContext;
    StringWriter sw = new StringWriter();
    LOG.debug(wrap.toString());

    try {
        jaxbContext = JAXBContext.newInstance(wrap.getCurrentClass());
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
        jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);  

        jaxbMarshaller.marshal(wrap.getClassInstance(), sw);

    } catch (JAXBException e) {
        LOG.error("Error marshalling the entity : " + wrap.getId(), e);
        throw new DocthequeException(
                "Error marshalling the entity : " + wrap.getId(), e);
    }
    LOG.debug(sw.toString());
    return sw.toString();
}

首先我得到了LOG.debug:

wrapper name : L_COM_ET_CVCM_REFUS_OUV_CPT_PRO
champs du wrapper :
AMT_CVCM_AFF_CODE_BARRE
AMT_DO_CODE_POSTAL_CLIENT
AMT_DO_INTITULE1_ADRESSE_CLIENT
AMT_DO_INTITULE2_ADRESSE_CLIENT
AMT_DO_LIGNE3_ADRESSE_CLIENT
AMT_DO_LIGNE4_ADRESSE_CLIENT
AMT_DO_LIGNE5_ADRESSE_CLIENT
AMT_DO_LIGNE6_ADRESSE_CLIENT
AMT_DO_NO_COMPTE
AMT_DO_VILLE_ADRESSE_CLIENT
AMT_DT_CVCM_CODE_BARRE
AMT_DT_CVCM_DEMATER
AMT_DT_CVCM_TYPEIMP
AMT_DT_ENVIRONNEMENT_CICS
AMT_DT_IDWO
A_COURDEST_CD_TICIV_L028_LO
L_COM_ADRES_BDF_CO

来自marshaller的结果:

 <L_COM_ET_CVCM_REFUS_OUV_CPT_PRO>
      <AMT_CVCM_AFF_CODE_BARRE/>
      <AMT_DO_CODE_POSTAL_CLIENT></AMT_DO_CODE_POSTAL_CLIENT>
      <AMT_DO_INTITULE1_ADRESSE_CLIENT></AMT_DO_INTITULE1_ADRESSE_CLIENT>
      <AMT_DO_INTITULE2_ADRESSE_CLIENT></AMT_DO_INTITULE2_ADRESSE_CLIENT>
      <AMT_DO_LIGNE3_ADRESSE_CLIENT/>
      <AMT_DO_LIGNE4_ADRESSE_CLIENT></AMT_DO_LIGNE4_ADRESSE_CLIENT>
      <AMT_DO_LIGNE5_ADRESSE_CLIENT/>
      <AMT_DO_LIGNE6_ADRESSE_CLIENT/>
      <AMT_DO_NO_COMPTE></AMT_DO_NO_COMPTE>
      <AMT_DO_VILLE_ADRESSE_CLIENT></AMT_DO_VILLE_ADRESSE_CLIENT>
      <AMT_DT_CVCM_CODE_BARRE/>
      <AMT_DT_CVCM_DEMATER></AMT_DT_CVCM_DEMATER>
      <AMT_DT_CVCM_TYPEIMP></AMT_DT_CVCM_TYPEIMP>
      <AMT_DT_ENVIRONNEMENT_CICS/>
      <AMT_DT_IDWO/>
      <a_COURDEST_CD_TICIV_L028_LO/>
      <l_COM_ADRES_BDF_CO/>
  </L_COM_ET_CVCM_REFUS_OUV_CPT_PRO>

预期:

 <L_COM_ET_CVCM_REFUS_OUV_CPT_PRO>
      <AMT_CVCM_AFF_CODE_BARRE/>
      <AMT_DO_CODE_POSTAL_CLIENT></AMT_DO_CODE_POSTAL_CLIENT>
      <AMT_DO_INTITULE1_ADRESSE_CLIENT></AMT_DO_INTITULE1_ADRESSE_CLIENT>
      <AMT_DO_INTITULE2_ADRESSE_CLIENT></AMT_DO_INTITULE2_ADRESSE_CLIENT>
      <AMT_DO_LIGNE3_ADRESSE_CLIENT/>
      <AMT_DO_LIGNE4_ADRESSE_CLIENT></AMT_DO_LIGNE4_ADRESSE_CLIENT>
      <AMT_DO_LIGNE5_ADRESSE_CLIENT/>
      <AMT_DO_LIGNE6_ADRESSE_CLIENT/>
      <AMT_DO_NO_COMPTE></AMT_DO_NO_COMPTE>
      <AMT_DO_VILLE_ADRESSE_CLIENT></AMT_DO_VILLE_ADRESSE_CLIENT>
      <AMT_DT_CVCM_CODE_BARRE/>
      <AMT_DT_CVCM_DEMATER></AMT_DT_CVCM_DEMATER>
      <AMT_DT_CVCM_TYPEIMP></AMT_DT_CVCM_TYPEIMP>
      <AMT_DT_ENVIRONNEMENT_CICS/>
      <AMT_DT_IDWO/>
      <A_COURDEST_CD_TICIV_L028_LO/>
      <L_COM_ADRES_BDF_CO/>
  </L_COM_ET_CVCM_REFUS_OUV_CPT_PRO>

为什么marshal在字段A_COURDEST_CD_TICIV_L028_LO和L_COM_ADRES_BDF_CO上给我一个小写?

我注意到只有在下划线前只有1个字符才会附加。没有问题,该字段被命名为AT_COURDEST_CD_TICIV_L028_LO

谢谢大家的时间。

2 个答案:

答案 0 :(得分:0)

在EntiteDynamiqueWrapper类中尝试以下内容:

@XmlElement( name = "A_COURDEST_CD_TICIV_L028_LO")
private SomeType A_COURDEST_CD_TICIV_L028_LO; // ( or your field       A_COURDEST_CD_TICIV_L028_LO);

@XmlElement( name = "L_COM_ADRES_BDF_CO")
 private SomeType L_COM_ADRES_BDF_CO;(  // Or your field bind to   L_COM_ADRES_BDF_CO );

答案 1 :(得分:0)

我找到了一个解决方案,让我的领域变得更高。我只是应用了一个正则表达式:

Matcher m = Pattern.compile("<[a-z]_|</[a-z]_").matcher(strToTransform);
            StringBuilder sb = new StringBuilder();
            int last = 0;
            while (m.find()) {
                sb.append(strToTransform.substring(last, m.start()));
                sb.append(m.group(0).toUpperCase());
                last = m.end();
            }
            sb.append(strToTransform.substring(last));
            return sb.toString();