source

spring을 사용하여 xml을 정리하고 marshal을 해제하는 방법은 무엇입니까?

factcode 2023. 3. 5. 21:53
반응형

spring을 사용하여 xml을 정리하고 marshal을 해제하는 방법은 무엇입니까?

봄 부츠 프로젝트가 있어요.내 프로젝트에 몇 가지 xds가 있어.maven-jaxb2-plugin을 사용하여 클래스를 생성했습니다.이 튜토리얼을 사용하여 샘플 스프링 부트 애플리케이션을 실행했습니다.

import org.kaushik.xsds.XOBJECT;

@SpringBootApplication
public class JaxbExample2Application {

public static void main(String[] args) {
    //SpringApplication.run(JaxbExample2Application.class, args);
    XOBJECT xObject = new XOBJECT('a',1,2);

    try {
        JAXBContext jc = JAXBContext.newInstance(User.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(xObject, System.out);

    } catch (PropertyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }
}

다만 스키마의 jaxb 클래스는 모두 맵해야 합니다.또한 봄에는 일을 쉽게 하기 위해 사용할 수 있는 것이 있습니다.Spring OXM 프로젝트를 살펴보았는데 애플리케이션 컨텍스트가 xml로 설정되어 있었습니다.스프링 부츠는 개봉 즉시 사용할 수 있는 것이 있습니까?어떤 예라도 도움이 될 것이다.

편집

xerx593의 답변을 시험해 보고 메인 방법으로 간단한 테스트를 실행했다.

    JaxbHelper jaxbHelper = new JaxbHelper();
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setClassesToBeBound(XOBJECT.class);
    jaxbHelper.setMarshaller(marshaller);
    XOBJECT xOBJECT= (PurchaseOrder)jaxbHelper.load(new StreamSource(new FileInputStream("src/main/resources/PurchaseOrder.xml")));
    System.out.println(xOBJECT.getShipTo().getName());

그것은 완벽하게 잘 작동했다.이제 스프링 부츠를 사용하여 플러그를 꽂기만 하면 됩니다.

OXM은 당신에게 딱 맞습니다!

Jaxb2Marshaller의 간단한 Java 구성은 다음과 같습니다.

//...
import java.util.HashMap;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
//...

@Configuration
public class MyConfigClass {
    @Bean
    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(new Class[]{
           //all the classes the context needs to know about
           org.kaushik.xsds.All.class,
           org.kaushik.xsds.Of.class,
           org.kaushik.xsds.Your.class,
           org.kaushik.xsds.Classes.class
        });
        // "alternative/additiona - ly":
          // marshaller.setContextPath(<jaxb.context-file>)
          // marshaller.setPackagesToScan({"com.foo", "com.baz", "com.bar"});

        marshaller.setMarshallerProperties(new HashMap<String, Object>() {{
          put(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
          // set more properties here...
        }});

        return marshaller;
    }
}

애플리케이션/서비스 클래스에서는 다음과 같이 접근할 수 있습니다.

import java.io.InputStream;
import java.io.StringWriter;
import javax.xml.bind.JAXBException;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;  

@Component
public class MyMarshallerWrapper {
   // you would rather:
   @Autowired
   private Jaxb2Marshaller  marshaller;
   // than:
   // JAXBContext jc = JAXBContext.newInstance(User.class);
   // Marshaller marshaller = jc.createMarshaller();

   // marshalls one object (of your bound classes) into a String.
   public <T> String marshallXml(final T obj) throws JAXBException {
      StringWriter sw = new StringWriter();
      Result result = new StreamResult(sw);
      marshaller.marshal(obj, result);
      return sw.toString();
   }

   // (tries to) unmarshall(s) an InputStream to the desired object.
   @SuppressWarnings("unchecked")
   public <T> T unmarshallXml(final InputStream xml) throws JAXBException {
      return (T) marshaller.unmarshal(new StreamSource(xml));
   }
}

Jaxb2Marshaller-javadoc 및 관련 답변을 참조하십시오.

당신이 원한다면serializing/deserializingXML을 사용한 빈입니다.jackson fasterxml좋은 선택입니다.

ObjectMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(new Simple());  // serializing

Simple value = xmlMapper.readValue("<Simple><x>1</x><y>2</y></Simple>",
     Simple.class); // deserializing

메이븐:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

참조: https://github.com/FasterXML/jackson-dataformat-xml

Spring BOOT는 매우 스마트하고 약간의 도움만으로도 필요한 것을 이해할 수 있습니다.

XML 마샬링/언마샬링을 작동시키려면 @XmlRootElement를 클래스에 추가하고 getter가 없는 필드에 @XmlElement를 추가하면 됩니다.또, 타겟 클래스는 자동적으로 시리얼화/디시리얼라이즈 됩니다.

다음으로 DTO의 예를 나타냅니다.

package com.exmaple;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.Date;
import java.util.Random;

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Setter
@XmlRootElement
public class Contact implements Serializable {
    @XmlElement
    private Long id;

    @XmlElement
    private int version;

    @Getter private String firstName;

    @XmlElement
    private String lastName;

    @XmlElement
    private Date birthDate;

    public static Contact randomContact() {
        Random random = new Random();
        return new Contact(random.nextLong(), random.nextInt(), "name-" + random.nextLong(), "surname-" + random.nextLong(), new Date());
    }
}

컨트롤러:

package com.exmaple;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value="/contact")
public class ContactController {
    final Logger logger = LoggerFactory.getLogger(ContactController.class);

    @RequestMapping("/random")
    @ResponseBody
    public Contact randomContact() {
        return Contact.randomContact();
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    @ResponseBody
    public Contact editContact(@RequestBody Contact contact) {
        logger.info("Received contact: {}", contact);
        contact.setFirstName(contact.getFirstName() + "-EDITED");
        return contact;
    }
}

풀코드의 예는 https://github.com/sergpank/spring-boot-xml 에서 확인할 수 있습니다.

어떤 질문이라도 환영합니다.

사용할 수 있습니다.StringSource/StringResult스프링으로 xml 소스를 읽다

 @Autowired
    Jaxb2Marshaller jaxb2Marshaller;

    @Override
    public Service parseXmlRequest(@NonNull String xmlRequest) {
        return (Service) jaxb2Marshaller.unmarshal(new StringSource(xmlRequest));
    }

    @Override
    public String prepareXmlResponse(@NonNull Service xmlResponse) {
        StringResult stringResult = new StringResult();
        jaxb2Marshaller.marshal(xmlResponse, stringResult);
        return stringResult.toString();
    }

언급URL : https://stackoverflow.com/questions/44676532/how-to-use-spring-to-marshal-and-unmarshal-xml

반응형