Jaxb Marshals то же XML-сообщение - PullRequest
1 голос
/ 20 октября 2019

Я использую Jaxb для маршалинга и демаршаллинга объектов. Это код моего пользовательского класса для этой цели.

import test.org.swt.SwitchMsg;
import test.org.swt.TrxMsg;
import org.springframework.context.annotation.Configuration;
import org.springframework.xml.transform.StringSource;

import javax.annotation.PostConstruct;
import javax.xml.bind.*;
import java.io.StringWriter;

@Configuration
public class JaxbConfig {

    private JAXBContext jaxbContext;

    @PostConstruct
    private void init(){
        try {
            jaxbContext = JAXBContext.newInstance(
                    SwitchMsg.class,
                    TrxMsg.class,
            );

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    public <T> T unmarshal(String xmlString, Class<T> clazz) {
        try {
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            JAXBElement<T> element = unmarshaller.unmarshal(new StringSource(xmlString), clazz);

            return element.getValue();

        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }

    public String marshal(Object object) {
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

            StringWriter stringWriter = new StringWriter();
            marshaller.marshal(object, stringWriter);
            return stringWriter.toString();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
}

Это мой код для демаршаллинга и маршаллинга. Как видите, я использую метод unmarshall () для создания объекта TrxMsg. И я использую данные для вызова другого метода, который возвращает объект TrxMsg. Но когда я делаю это снова, я возвращаю свой старый объект. Не новый. Я надеюсь, что мои комментарии кода прояснят больше. Мне нужно знать, почему это происходит и как это решить. Заранее спасибо.

private void processTransaction(ChannelHandlerContext ctx, String payload){

        String logMsg = payload;

        log.debug("Request received: \n{}", logMsg);

        //(1) 
        //I get a TrxMsg object by unmarshalling - Works perfectly fine
        TrxMsg trxMsg = jaxbConfig.unmarshal(payload, TrxMsg.class);
        Request request = new Request();

        SwitchMsg switchMsg = trxMsg.getMsg();

        request.setMessageId(switchMsg.getMessageId());
        request.setMessage(switchMsg);

        Response response = routerService.send(request);

        //response.getResponse() also returns a TrxMsg object but I get the same object 
        //I got in (1).
       //This TrxMsg object has different values. I tested in Logs
        String res = jaxbConfig.marshal(response.getResponse());

        log.info("Sending response: \n{}", res);
        final ByteBuf responseBuf = Unpooled.wrappedBuffer(res.getBytes(StandardCharsets.UTF_8));

        ChannelFuture future = ctx.writeAndFlush(responseBuf);
        future.addListener(ChannelFutureListener.CLOSE);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...