2017-06-21 17 views
5

Tôi có một dự án khởi động mùa xuân. Tôi có một vài xsds trong dự án của tôi. Tôi đã tạo ra các lớp bằng cách sử dụng maven-jaxb2-plugin. Tôi đã sử dụng hướng dẫn this để tải xuống ứng dụng khởi động mẫu.Làm thế nào để sử dụng mùa xuân để marshal và unmarshal xml?

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(); 
    } 
} 
} 

Nhưng quan tâm của tôi là tôi cần phải có tất cả các lớp jaxb của lược đồ được ánh xạ. Cũng có một cái gì đó trong mùa xuân mà tôi có thể sử dụng để làm cho nhiệm vụ của tôi dễ dàng hơn. Tôi đã xem dự án Spring OXM nhưng nó có bối cảnh ứng dụng được cấu hình trong xml. Có khởi động mùa xuân có bất cứ điều gì mà tôi có thể sử dụng ra khỏi hộp. Bất kỳ ví dụ nào cũng sẽ hữu ích.

Sửa

tôi đã cố gắng xerx593's answer và tôi chạy một thử nghiệm đơn giản sử dụng phương pháp chính

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()); 

Nó chạy hoàn toàn tốt đẹp. Bây giờ tôi chỉ cần cắm nó bằng cách sử dụng khởi động mùa xuân.

+0

Làm thế nào bạn cấu hình người vẽ bản đồ không quan trọng. XML chỉ là một phương tiện để kết thúc. Chỉ cần tạo một 'Jaxb2Marshaller' và sử dụng nó. –

+0

@M.Tất cả các ví dụ hiển thị cấu hình xml của jaxb2Marshaller, tôi đang tìm một ví dụ cấu hình Java. –

+0

Điều gì là khó khăn như vậy về 'new Jaxb2Marshaller() '? –

Trả lời

7

OXM chắc chắn là phù hợp với bạn!

Một cấu hình java đơn giản của một Jaxb2Marshaller sẽ trông như thế:

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

@Configuration 
public 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, 
      org.kaushik.xsds.Of, 
      org.kaushik.xsds.Your, 
      org.kaushik.xsds.Classes 
     }); //"alternatively" setContextPath(<jaxb.context>), 

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

     return marshaller; 
    } 
} 

Trong Application/lớp dịch vụ của bạn, bạn có thể tiếp cận như thế này:

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 MyMarshallerWrapper { 
    // you would rather: 
    @Autowired 
    private Jaxb2Marshaller marshaller; 
    // than: 
    // JAXBContext jc = JAXBContext.newInstance(User.class); 
    // Marshaller marshaller = jc.createMarshaller(); 

    // marshals 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)); 
    } 
} 

Xem Jaxb2Marshaller-javadoc, và một liên quan Answer

+0

Tôi sẽ thử điều này khi tôi trở lại làm việc, trông giống như những gì tôi cần. Nhưng nhìn vào javadoc, bạn cũng có thể làm 'marshaller.setPackagesToScan (" org.kaushik.xsds ")' (có chứa các lớp JAXB xjc tạo ra của tôi), đúng không? – daniu

1

Spring BOOT rất thông minh và có thể hiểu những gì bạn cần với một chút trợ giúp.

Để làm cho công việc sắp xếp/sắp xếp XML không đơn giản, bạn chỉ cần thêm chú thích @XmlRootElement vào lớp và @XmlElement vào các trường không có lớp getter và target sẽ được tự động tuần tự hóa/deserialized.

Dưới đây là ví dụ 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()); 
    } 
} 

Và Controller:

gói 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; 
    } 
} 

Bạn có thể check-out mã đầy đủ ví dụ ở đây: https://github.com/sergpank/spring-boot-xml

Mọi thắc mắc đều được chào đón.

3

Nếu bạn chỉ muốn serializing/deserializing đậu bằng XML. Tôi nghĩ jackson fasterxml là một lựa chọn tốt:

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 

maven:

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

Tham khảo: https://github.com/FasterXML/jackson-dataformat-xml

Các vấn đề liên quan