BeanIO 2.1 Обернутые сегменты

Привет, ребята, я использую BeanIO для записи в файл CSV.

У меня есть сложная структура класса, которую я хочу вывести в один столбец. И вот классы, которые я использую. «Основной» класс — GprsEvent:

public class GprsEvent
{
    private ListOfServiceData   listOfServiceData;
    // setters and getters omitted
}

public class ListOfServiceData implements Serializable
{
    private List<ChangeOfServiceCondition> seqOf = null;
    // setters and getters omitted
}

public class ChangeOfServiceCondition implements Serializable
{
    private RatingGroupId ratingGroup = null;
    private ChargingRuleBaseName chargingRuleBaseName = null;
    private ResultCode resultCode = null;
    private LocalSequenceNumber localSequenceNumber = null;
    private TimeStamp timeOfFirstUsage = null;
    private TimeStamp timeOfLastUsage = null;
    private CallDuration timeUsage = null;
    private ServiceConditionChange serviceConditionChange = null;
    **private EPCQoSInformation qoSInformationNeg = null;** // Complex Type
    private GSNAddress servingNodeAddress = null;
    private DataVolumeGPRS datavolumeFBCUplink = null;
    private DataVolumeGPRS datavolumeFBCDownlink = null;
    private TimeStamp timeOfReport = null;
    private FailureHandlingContinue failureHandlingContinue = null;
    private ServiceIdentifier serviceIdentifier = null;
    private BerOctetString userLocationInformation = null;
    // setters and getters omitted
}

public class EPCQoSInformation implements Serializable
{

    public byte[] code = null;
    private BerInteger qCI = null;
    private BerInteger maxRequestedBandwithUL = null;
    private BerInteger maxRequestedBandwithDL = null;
    private BerInteger guaranteedBitrateUL = null;
    private BerInteger guaranteedBitrateDL = null;
    private BerInteger aRP = null;
    // setters and getters omitted
}

Я прочитал документацию BeanIO и нашел, как сделать то, что я намеревался: http://beanio.org/2.1/docs/reference/index.html#AdvancedTopics5.8.2. Обернутые сегменты

Итак, это часть моего XML-файла beanio:

<record class="net.atos.tools.radiation.convert.event.gprs.GprsEvent"
        name="sGWRecord" maxOccurs="unbounded" minOccurs="0" order="1">

    <segment name="listOfServiceData">
    <segment name="listOfServiceData" class="net.atos.open.muc.generated.datatypes.ListOfServiceData"> 
        <segment name="changeOfServiceCondition">
        <segment name="changeOfServiceCondition" class="net.atos.open.muc.generated.datatypes.ChangeOfServiceCondition" collection="list" minOccurs="0" maxOccurs="unbounded">
             <field name="ratingGroup" type="net.atos.open.muc.generated.datatypes.RatingGroupId" />
             <field name="chargingRuleBaseName" type="net.atos.open.muc.generated.datatypes.ChargingRuleBaseName" />
             <field name="resultCode" type="net.atos.open.muc.generated.datatypes.ResultCode" />
             <field name="localSequenceNumber" type="net.atos.open.muc.generated.datatypes.localSequenceNumberp"/> 
             <field name="timeOfFirstUsage" type="net.atos.open.muc.generated.datatypes.TimeStamp"/> 
             <field name="timeOfLastUsage" type="net.atos.open.muc.generated.datatypes.TimeStamp"/> 
             <field name="timeUsage" type="net.atos.open.muc.generated.datatypes.CallDuration"/> 
             <segment name="qoSInformationNeg">
             <segment name="qoSInformationNeg" class="net.atos.open.muc.generated.datatypes.EPCQoSInformation" occursRef="timeUsage">
                    <field name="qCI" type="org.openmuc.jasn1.ber.types.BerInteger"/>
                    <field name="maxRequestedBandwithUL" type="org.openmuc.jasn1.ber.types.BerInteger"/>
                    <field name="maxRequestedBandwithDL" type="org.openmuc.jasn1.ber.types.BerInteger"/>
                    <field name="guaranteedBitrateUL" type="org.openmuc.jasn1.ber.types.BerInteger"/>
                    <field name="guaranteedBitrateDL" type="org.openmuc.jasn1.ber.types.BerInteger"/>
                    <field name="aRP" type="org.openmuc.jasn1.ber.types.BerInteger"/>
             </segment>
             </segment>
        </segment>
        </segment>
    </segment>
    </segment>  

</record>

Я получаю следующую ошибку: org.beanio.BeanIOConfigurationException: Неверный сегмент 'qoSInformationNeg', в сегменте 'qoSInformationNeg', в сегменте 'changeOfServiceCondition', в сегменте 'changeOfServiceCondition', в сегменте 'listOfServiceData', в сегменте 'listOfServiceData ', в записи 'sGWRecord', в потоке 'gprs': Требуется сбор данных, если maxOccurs больше 1 и задан класс


person SimpleThings    schedule 24.08.2017    source источник


Ответы (1)


Хорошо, я сам нашел решение, проблема возникает, когда присутствует более одного collection="list". Например, в моем файле XML первое появление списка:

<field name="sgsnAddressLength" type="java.lang.Integer" typeHandler="sgsnAddressLengthHandler" /> 
<field name="sgsnAddresses" type="net.atos.open.muc.generated.datatypes.GSNAddress" collection="list" occursRef="sgsnAddressLength" typeHandler="sgsnAddressesHandler" /> 

Где следующий список происходит после этого:

<segment name="changesOfServiceCondition" class="net.atos.open.muc.generated.datatypes.ChangeOfServiceCondition" 
                     collection="list" minOccurs="0" maxOccurs="1">

В поле, где присутствует первое вхождение в списке, вы должны добавить ключевое слово: existsRef. В моем случае имя первого списка — sgsnAddresses, и мне пришлось добавить occursRef="sgsnAddressLength" , поскольку sgsnAddressLength — это поле, предшествующее первому вхождению списка.

person SimpleThings    schedule 25.08.2017