标签: jaxb

JAXB每个应用程序一个Marshaller实例和一个Unmarshaller实例

我有Web应用程序,其中有从xsd模式生成的类。我正在创建一个Marshaller实例和一个Unmarshaller实例作为应用程序启动时的静态最终字段。

我想知道这是否是一种好习惯,还是最好根据需要创建独立的实例?

java jaxb

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

jaxb2-maven-plugin为默认值= INF的双精度生成无效源

我有一个问题,当XSD文件包含双精度的默认值时,jaxb2-maven-plugin会生成无效的源代码.

我使用jaxb2-maven-plugin(org.codehaus.mojo)1.5版:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.5</version>
    <configuration>
    </configuration>
    <executions>
        <execution>
            <id>analysis_jaxb</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <clearOutputDir>false</clearOutputDir>
                <schemaFiles>Analysis.xsd</schemaFiles>
                <packageName>xx.xx.xx.analysis</packageName>
                <generateDirectory>${project.build.directory}/generated-sources/jaxb/analysis</generateDirectory>
                <verbose>true</verbose>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

从以下XSD文件生成Java Source:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:element name="MinMax" type="MinMaxType"/>

    <xs:complexType name="MinMaxType">
        <xs:attribute name="min" type="xs:double" default="-INF" />
        <xs:attribute name="max" type="xs:double" default="INF" />
    </xs:complexType>

</xs:schema> 
Run Code Online (Sandbox Code Playgroud)

生成的Java文件包含以下方法:

public double getMin() {
    if (min == null) {
        return -InfinityD; //UNDEFINED
    } else {
        return min;
    }
}
Run Code Online (Sandbox Code Playgroud)

该字段-InfinityD未在任何地方定义.

使用布尔值(例如<xs:attribute name="minInclusive" type="xs:boolean" default="false" />)时,默认值按预期工作.

与此相反,插件 …

xsd jaxb maven maven-jaxb2-plugin jaxb2-maven-plugin

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

从JAXB强制转换null java.lang.Integer会产生0,而不是null

我有以下XML:

<person>
    <id/>
    <Identifier/>
    <Surname>TEST</Surname>
    <Forename1>TEST</Forename1>
    <Forename2/>
    <Title>MR</Title>
    <Gender>M</Gender>
</person>
Run Code Online (Sandbox Code Playgroud)

通过序列化以下类产生:

package anonymised.packagename;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "", propOrder = {
    "Id",
    "Identifier",
    "Surname",
    "Forename1",
    "Forename2",
    "Title",
    "Sex"
})

@XmlRootElement(name = "person")
public class person{

    @XmlElement(name = "id", nillable=true)
    protected Integer Id;
    public Integer getId(){
        return Id;
    }

    public void setId(Integer value){
        this.Id = value;
    }

    @XmlElement(name = "Identifier", nillable=true)
    protected String Identifier;
    public String getIdentifier(){
        return Identifier;
    } …
Run Code Online (Sandbox Code Playgroud)

java xml casting jaxb

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

如何告诉JAXB添加noNameSpaceSchemaLocation属性

我有一个特定的类层次结构,它使用JAXB转换为XML。我希望创建的XML在head元素中具有xsi:noNamespaceSchemaLocation和xmls:xsi属性(xsi:noNamespaceSchemaLocation =“ Something.xsd” xmls:xsi =“ http://www.w3.org/2001/XMLSchema-instance ”)。我不希望JAXB以任何方式使用架构-仅存储这些属性和值。

是否有针对此的特定注释?我可以创建一个恒定的XmlAttribute,但似乎错了...

谢谢

java xml xsd jaxb

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

JAXB - 将继承用于动态标记名称

我试图使用JAXB将XML编组为类heiarchy - 我希望heiarchy以通用方式使用继承.我会更好地解释一下:

我有以下XML:

<Country name="USA">
    <City name="NewYork">
      <Street name="Something"/>
      <Street name="Something2"/>
    </City>
    <City name="LosAngeles">
       <Street name="Something"/>
       <Street name="Something2"/>
    </City>
<Country>
<Country .....>
   <.....>
    <.....
</Country>
Run Code Online (Sandbox Code Playgroud)

等eatch国家可以有多个城市,每个城市可以有多条街道.

我想创建一个名为GeneralLocation的类,它看起来像这样:

 @XmlTransient
    public abstract class GeneralLocation {

        private String name;
        protected List<GeneralLocation> sons;


        @XmlAttribute(name="name")  
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<GeneralLocation> getSons(){
              return this.sons
        }

        public void setSons(List<GeneralLocation> sons){
              this.sons = sons;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后创建Country,City和Street类以从GeneralLocation继承并使用正确的JAXB解析名称覆盖getSons方法.

public class Country extends GeneralLocation{

        @XmlElement(name="City")
        public …
Run Code Online (Sandbox Code Playgroud)

java xml inheritance jaxb

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

将MOXy设置为JAXB Provider,而不在同一个包中使用属性文件

我试图使用MOXy作为我的JAXB提供程序,以便将内容编组/解组成XML/JSON.

我用内容创建了"jaxb.properties"文件: javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactor

一切正常.

        JAXBContext jaxbContext = JAXBContext.newInstance(ServerInformation.class); // The jaxb.properties must be in the same package as "ServerInformation.java"
        Marshaller marshaller = jaxbContext.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
        marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有解决方案将此文件放在另一个包中?我正在使用Maven插件"wadl2java"来生成一些包和类,并且在每次Maven构建之后,所有包都被删除并重新创建.所以我每次都丢失这个文件...我想在我的ressource包中没有"jaxb.properties"的情况下将MOXy设置为我的JAXB提供程序.我在同一个项目中有一些其他软件包,我可以把这个文件放进去.

任何的想法 ?

谢谢.

java json jaxb marshalling moxy

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

如何在gradle-jaxb-plugin中使用jaxb插件扩展

我使用gradle-jaxb-plugin从XSD生成类:https: //github.com/jacobono/gradle-jaxb-plugin

它与外部绑定工作正常,我可以使用内置的XJC扩展没有问题.但我没有管理jaxb扩展插件工作,特别是-jinheritance来自jaxb2-basics.

当我尝试gradle-jaxb-plugin文档中提出的配置时,我收到以下错误:

:pwa-application:xjc FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':pwa-application:xjc'.
> java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin: Provider org.jvnet.jaxb2_commons.plugin.jaxbindex.JaxbIndexPlugin not a subtype
Run Code Online (Sandbox Code Playgroud)

我在这个帖子中找到了解释: com.sun.tools.xjc.Plugin:Provider <plugin>不是子类型 但是gradle-jaxb-plugin没有解决方案,我卡住了.

java jaxb gradle jaxb2-basics

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

Gradle构建失败

我正在使用https://spring.io/guides/gs/producing-web-service/#initial上的教程来尝试生成SOAP Web服务.我正在使用Gradle来管理我的依赖项.

我有一个.xsd文件,它指定了我想要gradle创建的某些类.

但是,当我尝试在eclipse中的build.gradle文件上运行gradle构建时,我收到以下错误:

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\zekucukkose\workspace2\gs-producing-web-service-initial\build.gradle' 
line: 32

* What went wrong:
A problem occurred evaluating root project 'gs-producing-web-service-initial'.

> Could not find method jaxb() for arguments [com.sun.xml.bind:jaxb-xjc:2.2.4-1]
 on root project 'gs-producing-web-service-initial'.
Run Code Online (Sandbox Code Playgroud)

第27至34行如下:

27 dependencies {
28    compile("org.springframework.boot:spring-boot-starter-web")
29        compile("org.springframework.boot:spring-boot-starter-ws")
30    testCompile("org.springframework.boot:spring-boot-starter-test")
31    compile("wsdl4j:wsdl4j:1.6.1")
32    jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1")
33    compile(files(genJaxb.classesDir).builtBy(genJaxb))
34 }
Run Code Online (Sandbox Code Playgroud)

就我所知,jaxb是用于生成实际类的东西.

如果有人可以提供帮助,我真的很感激.谢谢

这是整个脚本:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: …
Run Code Online (Sandbox Code Playgroud)

java spring xsd jaxb gradle

2
推荐指数
2
解决办法
3414
查看次数

Java-8中Xml Unmarshalling错误的任何替代解决方案?:"安全处理org.xml.sax.SAXNotRecognizedException"

注意:这里已经讨论过这个错误,并且已经提出了各种解决方案来摆脱与java-8的默认实现冲突的jar.

我的问题是这个问题的延伸.

为了完整起见,这里是我也面临的堆栈跟踪,当我用java-8运行代码时:

Feb 29, 2016 12:06:41 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory
SEVERE: null
org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing
    at org.apache.xerces.parsers.AbstractSAXParser.setFeature(AbstractSAXParser.java:1487)
    at org.apache.xerces.jaxp.SAXParserImpl.setFeatures(SAXParserImpl.java:145)
    at org.apache.xerces.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:128)
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:112)
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:140)
    at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:121)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:276)
Run Code Online (Sandbox Code Playgroud)

为了证明冲突的jar确实是问题(如之前共享的链接中所述),我确实将相关代码拉出到另一个项目中并使用java-8成功运行代码(即没有任何错误)最低数量的罐子.到现在为止还挺好.

现在查询:

就我而言,我的遗留项目使用了大约2-3个已知的冲突罐,这些罐由于各种原因而被使用.但是,有一个新模块使用注释驱动的jaxb进行oxm处理.

问题是:我无法摆脱那些旧的和冲突的罐子,因为这几乎使得10%的代码库无法编译.但是,与此同时,我也不希望在新模块中摆脱jaxb/oxm实现.

有没有办法让我可以告诉JVM忽略旧jar并使用java-8附带的默认实现,只要代码执行通过这个新模块?

java jaxb jaxb2 xml-parsing java-8

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

如何分析Java 8压缩类空间中的内存泄漏?

一些上下文:我们已将Web应用程序的环境从在Java 7上运行升级到在Java 8和Tomcat 8上运行(64位arch,堆大小约2 GB,PermGen大小= 256 MB,对元空间大小没有约束).过了一会儿,我们开始收到以下错误:

java.lang.OutOfMemoryError:压缩的类空间

这意味着UseCompressedClassPointers所需的空间超出了CompressedClassSpaceSize.那时VisualVM显示了2 GB的元空间大小.

现在使用VisualVM工具,我们可以看到Metaspace大小随着每个请求大约3 MB而不断增加,但是堆似乎没有这样做.堆使用具有锯齿形状,在每个GC之后返回到相同的低点.

我可以告诉应用程序仅在使用Java JAXB操作时泄漏元数据,但我无法用VisualVM证明它.

该应用程序依赖于webservices-rt-1.4作为JAXB实现提供程序.该应用程序使用编组,解组.XSD的类生成是使用maven-jaxb2-plugin-0.13.1完成的.


更新:

在跟踪类加载和卸载之后,我发现WebAppClassLoader多次将相同的JAXB类加载到内存中,但从未清理过.而且,堆中没有实例.我调试了,我看到JDK通过反射调用方法javax.xml.bind.JAXBContext com.sun.xml.bind.v2.ContextFactory.createContext,这是在创建类时.

我虽然这些课程都是由GC清理的.是否负责清理classLoader?


问题:有没有办法分析元空间对象?为什么我在元空间中有泄漏而在堆中没有泄漏?他们不相关吗?这甚至可能吗?

为什么应用程序可以正常使用PermGen而不是Metaspace?

memory-leaks metadata jaxb out-of-memory java-8

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