标签: spring-oxm

如何使用spring来编组和解组xml?

我有一个春季启动项目.我的项目中有几个xsds.我使用maven-jaxb2-plugin生成了类.我已经使用教程来运行示例Spring启动应用程序.

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();
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

但我担心的是我需要映射架构的所有jaxb类.还有一些东西在Spring中可以用来使我的任务更容易.我查看了Spring OXM项目,但它在xml中配置了应用程序上下文.弹簧靴是否有任何我可以开箱即用的东西.任何例子都会有所帮助.

编辑

我尝试了xerx593的答案,并使用main方法运行了一个简单的测试

    JaxbHelper jaxbHelper = new JaxbHelper();
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setClassesToBeBound(XOBJECT.class); …
Run Code Online (Sandbox Code Playgroud)

spring jaxb spring-oxm spring-boot

12
推荐指数
3
解决办法
4万
查看次数

在Maven项目中管理JAXB生成的类

我有一个基于Maven的项目,我尝试添加一些由"jaxb2-maven-plugin"Maven插件自动生成的JAXB类.但是,我的第一个剪辑让我进入循环依赖循环:

  • 由于尚未生成这些JAXB类,因此引用它们的其他源会出现编译错误.
  • 因为那些其他源有编译错误,所以不会生成这些JAXB类.

似乎有两种明显的可能性来解决这个问题:

  1. 注释掉损坏的引用,以便构建项目并自动生成JAXB类.然后将这些生成的源复制/target/src/main/java,以便对它们的引用不会导致编译错误.
  2. 创建一个完全独立的项目,除了JAXB之外什么都没有.将其作为主项目中的依赖项包含在内.

我在这里错过了什么吗?选项#1看起来很荒谬......这不是人们使用JAXB的方式.选项#2似乎更合理,但仍然相当低效和繁琐.我真的不得不承担一个完全独立的项目的开销只是为了使用JAXB?

开发人员是否有更优雅的方法在Maven插件生成它们的同一个项目中引用JAXB生成的类?

更新: 根据要求,这是我的POM的相关部分:

<build>
    <plugins>
        <plugin>
            <!-- configure the compiler to compile to Java 1.6 -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>       
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- The name of your generated source package -->
                <packageName>com.mypackage</packageName> 
            </configuration>
        </plugin>
    </plugins>  
</build>
Run Code Online (Sandbox Code Playgroud)

当我运行时mvn clean package,我会看到我的JAXB源是在/target子目录下生成的.但是,这些生成的源不会自动添加到编译阶段的类路径中.

POST-RESOLUTION UPDATE: 事实证明我的编译问题更多地与我在Eclipse中运行的事实有关,而且它的Maven集成在"jaxb2-maven-plugin"中存在一些问题.有关问题及其解决方案的更多详细信息,请参阅此StackOverflow问题.

java jaxb java-ee maven spring-oxm

11
推荐指数
2
解决办法
3万
查看次数

JDK17 + Spring Boot Starter Web 服务:在模块路径或类路径上未找到 JAXB-API 的实现

我有一个简单的 Spring Boot 应用程序,我想将请求发送到 SOAP 端点。不幸的是,每次我尝试这样做时,我都会收到:javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath。我非常有信心我拥有所有必需的库,但我不知道为什么会发生这种情况

Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:177)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:364)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:508)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:465)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:366)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.createJaxbContextFromContextPath(Jaxb2Marshaller.java:540)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.getJaxbContext(Jaxb2Marshaller.java:500)
    ... 18 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:174)
    ... 24 common frames omitted
Run Code Online (Sandbox Code Playgroud)

我使用的是JDK17

openjdk 17.0.2 2022-01-18
OpenJDK …
Run Code Online (Sandbox Code Playgroud)

java spring-ws jaxb spring-oxm spring-boot

8
推荐指数
1
解决办法
2万
查看次数

XStreamMarshaller的漏洞警告

当使用带弹簧批的XStreamMarshaller时,我收到以下消息:

Security framework of XStream not initialized, XStream is probably vulnerable.
Run Code Online (Sandbox Code Playgroud)

首先尝试:根据文档,我试图重置所有权限,但我仍然有相同的消息.此外,在解析XML文件时我没有安全性错误...所以我认为这段代码不起作用.这是一个代码示例:

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().addPermission(NoTypePermission.NONE);
Run Code Online (Sandbox Code Playgroud)

第二次尝试:我也尝试过该setSupportedClasses方法,但它也不起作用(我仍然得到漏洞消息,并且不支持的类仍然无法正确排除):

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setSupportedClasses(FooBar.class);
Run Code Online (Sandbox Code Playgroud)

如何使用XStreamMarshaller设置安全权限?

注意:根据这个帖子,安全框架是在1.4.7中引入的,它仍然不是强制性的......但它对XStream 1.5.0是强制性的!

使用的XStream版本:1.4.10

使用的Spring Batch版本:4.0.1

有关信息,我使用的是Spring Boot(但我不确定它是否与此相关)

spring xstream spring-batch spring-oxm spring-boot

5
推荐指数
1
解决办法
1417
查看次数

使用EclipseLink MOXy解组时忽略DTD

当尝试使用EclipseLink MOXy将一些XML解组为POJO时,我正在FileNotFoundException寻找将文档的DTD作为相对路径的地方.

Exception in thread "main" org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException
 - with linked exception:
[java.io.FileNotFoundException: C:\Users\deejay\Documents\workspace-sts-3.0.0.RELEASE\moxy-test\ieee_idams_exchange.dtd (The system cannot find the file specified)]
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:761)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:682)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:665)
    at com.mendeley.services.utility.EclipseLinkMarshaller.load(EclipseLinkMarshaller.java:29)
    at com.mendeley.MoxyTest.main(MoxyTest.java:31)
Run Code Online (Sandbox Code Playgroud)

我按照这个例子提供了"外部元数据" ,所以我不知道为什么它甚至需要一个DTD.如果我能让它忽略DTD,或者不尝试解决它,那就太好了.

java jaxb eclipselink moxy spring-oxm

4
推荐指数
1
解决办法
3612
查看次数