春のブートプロジェクトがあります。私のプロジェクトにはいくつかのxsdsがあります。私はmaven-jaxb2-pluginを使用してクラスを生成しました。 this チュートリアルを使用して、サンプルのスプリングブートアプリケーションを実行しています。
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には、タスクを簡単にするために使用できるものがあります。 Spring [〜#〜] oxm [〜#〜] プロジェクトを見てきましたが、xmlで構成されたアプリケーションコンテキストがありました。スプリングブーツには、すぐに使用できるものがありますか。どんな例でも役立ちます。
編集
xerx593's answer を試し、mainメソッドを使用して簡単なテストを実行しました
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は間違いなくあなたにぴったりです!
単純なJava Jaxb2Marshallerの構成は次のようになります。
//...
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
}); //"alternatively" setContextPath(<jaxb.context>),
marshaller.setMarshallerProperties(new HashMap<String, Object>() {{
put(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
}});
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 および関連する Answer を参照してください
単にserializing/deserializing
XMLを使用したBean。おもう jackson fasterxml
は1つの適切な選択肢です。
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>
Spring BOOTは非常に賢く、少し助けを借りて必要なものを理解できます。
XMLマーシャリング/アンマーシャリングを機能させるには、アノテーションを@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());
}
}
そしてコントローラー:
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
を使用して、springで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();
}