2017-06-21 24 views
5

私は春のブートプロジェクトを持っています。私は私のプロジェクトにいくつかのxsdsを持っています。私はmaven-jaxb2-pluginを使ってクラスを生成しました。私はthisチュートリアルを使用してサンプルスプリングブートアプリケーションを実行しています。spring to marshalとunmarshal xmlの使い方は?

しかし、懸念されているのは、スキーマのすべてのjaxbクラスをマップする必要があるということです。また、春には自分の仕事を楽にするために使うことができるものがあります。私はSpringのOXMプロジェクトを見てきましたが、xmlにアプリケーションコンテキストが設定されていました。春の靴には、私が使用できる何かがありますか?すべての例が参考になります。

編集

私はxerx593's answerを試してみましたが、私はそれは完全に罰金走っ

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

mainメソッドを使用して簡単なテストを実行しました。今私はそれを春のブートを使用してプラグインする必要があります。

+0

をあなたは関係ありませんマッパーを設定する方法

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 

達人:私はjackson fasterxmlは1つの良い選択だと思います。 XMLは終わりの手段にすぎません。 'Jaxb2Marshaller'を作成して使用してください。 –

+0

@M。Deinumすべての例は、jaxb2Marshallerのxml構成を示しています。Javaの構成例を探しています。 –

+0

'new Jaxb2Marshaller()'についてとても難しいのは何ですか? –

答えて

7

OXMはあなたにとって間違いなく正しいです!あなたはこのように近づくことができ、あなたのアプリケーション/サービスのクラスでは

//... 
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; 
    } 
} 

:Jaxb2Marshallerの

単純なJavaの構成は次のようになり

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

Jaxb2Marshaller-javadocを参照してください、との関連Answer

+0

私が仕事に戻ったときにこれを試してみましょう、私が必要とするもののように見えます。しかし、javadocを見れば、 'marshaller.setPackagesToScan(" org.kaushik.xsds ")'(私のxjc生成のJAXBクラスが含まれているでしょう)ということでしょうか? – daniu

1

スプリングブーツは非常にスマートで、少しでも手助けをして必要なものを理解することができます。

XMLマーシャリング/アンマーシャリング作業を行うには、クラスに@XmlRootElement @XmlRootElementを追加し、フィールドに@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()); 
    } 
} 

とコントローラです:

パッケージ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

ご質問は歓迎されています。