Как исправить проблему кодирования при маршалинге Java-объекта - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю с симулятором и участвуют два запроса:

1) Запрос A отправляется, а ответ A извлекается и направляется в xml строка.

2) Часть запроса B содержит ответ A, который я извлек из ответа A, выполнив:

String dataString = StringUtils.substringBetween(getDataServiceResponse, 
DATA_STRING_START, DATA_STRING_END);

Я пытаюсь выполнить маршалинг запроса B, но часть, содержащая ответ A, не маршалируется, как я ожидаю (проблема с кодировкой). Я вставил xml ниже, объясняя, в чем проблема.

Я пытался установить свойства маршаллера:

private String marshall(Object data, Marshaller marshaller) throws 
JAXBException
{
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  StringWriter writer = new StringWriter();
  marshaller.marshal(data, writer);

  return writer.toString();
}

Ожидаемый результат:

  <Data type="XML">
    <OfferLookups>
      <Offer cache="1" content="1" expiry="1430434799" id="9078" present="1" promoId="4255">
        <Action>
          <Prn id="254" targetPrinter="EPSON::TM_T88IV">
            <Bep count="1" id="144" />
            <Overlay id="200" printDirection="topToBottom">
              <Group hAlign="center" id="201">
                <Img filename="file:///retailer_logo1.png" hAlign="center" id="210" />
              </Group>
            </Overlay>
            <Group hAlign="center" id="19" printDirection="topToBottom">
              <Text bold="true" charAlign="center" id="4">GREAT OFFER 1</Text>
              <Line id="6" />
            </Group>
            <Cut id="500" lineFeed="100" type="full" />
         </Prn>
       </Action>
     </Offer>
   </OfferLookups>
 </Data>  

Фактический результат:

 <Data>
    &lt;OfferLookups&gt;
      &lt;Offer cache="1" content="1" expiry="1430434799" id="9078" present="1" promoId="4255"&gt;
        &lt;Action&gt;
          &lt;Prn id="254" targetPrinter="EPSON::TM_T88IV"&gt;
            &lt;Bep count="1" id="144" /&gt;
            &lt;Overlay id="200" printDirection="topToBottom"&gt;
              &lt;Group hAlign="center" id="201"&gt;
                &lt;Img filename="file:///retailer_logo1.png" hAlign="center" id="210" /&gt;
              &lt;/Group&gt;
            &lt;/Overlay&gt;
            &lt;Group hAlign="center" id="19" printDirection="topToBottom"&gt;
              &lt;Text bold="true" charAlign="center" id="4"&gt;GREAT OFFER 1&lt;/Text&gt;
              &lt;Line id="6" /&gt;
            &lt;/Group&gt;
            &lt;Cut id="500" lineFeed="100" type="full" /&gt;
         &lt;/Prn&gt;
       &lt;/Action&gt;
     &lt;/Offer&gt;
   &lt;/OfferLookups&gt;
 </Data>

1 Ответ

0 голосов
/ 10 апреля 2019

Я получил эту работу, получив помощь от JAXB Marshalling .

Было два важных бита:

1) Мне пришлось изменить маршальную логику:

  StringWriter stringWriter = new StringWriter();
                    PrintWriter printWriter = new PrintWriter(stringWriter);
                    DataWriter dataWriter = new DataWriter(printWriter, "UTF-8", new JaxbCharacterEscapeHandler());

2) Реализовать JaxbCharacterEscapeHandler:

import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

public class JaxbCharacterEscapeHandler implements CharacterEscapeHandler {

    public void escape(char[] buf, int start, int len, boolean isAttValue,
                    Writer out) throws IOException {

            for (int i = start; i < start + len; i++) {
                    char ch = buf[i];
                    out.write(ch);
            }
    }

}

...