我有一个春季启动项目.我的项目中有几个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();
    }
 }
}
但我担心的是我需要映射架构的所有jaxb类.还有一些东西在Spring中可以用来使我的任务更容易.我查看了Spring OXM项目,但它在xml中配置了应用程序上下文.弹簧靴是否有任何我可以开箱即用的东西.任何例子都会有所帮助.
编辑
我尝试了xerx593的答案,并使用main方法运行了一个简单的测试
    JaxbHelper jaxbHelper = new JaxbHelper();
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setClassesToBeBound(XOBJECT.class); …我有一个基于Maven的项目,我尝试添加一些由"jaxb2-maven-plugin"Maven插件自动生成的JAXB类.但是,我的第一个剪辑让我进入循环依赖循环:
似乎有两种明显的可能性来解决这个问题:
/target到/src/main/java,以便对它们的引用不会导致编译错误.我在这里错过了什么吗?选项#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>
当我运行时mvn clean package,我会看到我的JAXB源是在/target子目录下生成的.但是,这些生成的源不会自动添加到编译阶段的类路径中.
POST-RESOLUTION UPDATE: 事实证明我的编译问题更多地与我在Eclipse中运行的事实有关,而且它的Maven集成在"jaxb2-maven-plugin"中存在一些问题.有关该问题及其解决方案的更多详细信息,请参阅此StackOverflow问题.
我有一个简单的 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
我使用的是JDK17
openjdk 17.0.2 2022-01-18
OpenJDK …当使用带弹簧批的XStreamMarshaller时,我收到以下消息:
Security framework of XStream not initialized, XStream is probably vulnerable.
首先尝试:根据文档,我试图重置所有权限,但我仍然有相同的消息.此外,在解析XML文件时我没有安全性错误...所以我认为这段代码不起作用.这是一个代码示例:
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().addPermission(NoTypePermission.NONE);
第二次尝试:我也尝试过该setSupportedClasses方法,但它也不起作用(我仍然得到漏洞消息,并且不支持的类仍然无法正确排除):
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setSupportedClasses(FooBar.class);
如何使用XStreamMarshaller设置安全权限?
注意:根据这个帖子,安全框架是在1.4.7中引入的,它仍然不是强制性的......但它对XStream 1.5.0是强制性的!
使用的XStream版本:1.4.10
使用的Spring Batch版本:4.0.1
有关信息,我使用的是Spring Boot(但我不确定它是否与此相关)
当尝试使用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)
我按照这个例子提供了"外部元数据" ,所以我不知道为什么它甚至需要一个DTD.如果我能让它忽略DTD,或者不尝试解决它,那就太好了.
spring-oxm ×5
jaxb ×4
java ×3
spring-boot ×3
spring ×2
eclipselink ×1
java-ee ×1
maven ×1
moxy ×1
spring-batch ×1
spring-ws ×1
xstream ×1