我有Web应用程序,其中有从xsd模式生成的类。我正在创建一个Marshaller实例和一个Unmarshaller实例作为应用程序启动时的静态最终字段。
我想知道这是否是一种好习惯,还是最好根据需要创建独立的实例?
我有一个问题,当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" />)时,默认值按预期工作.
与此相反,插件 …
我有以下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) 我有一个特定的类层次结构,它使用JAXB转换为XML。我希望创建的XML在head元素中具有xsi:noNamespaceSchemaLocation和xmls:xsi属性(xsi:noNamespaceSchemaLocation =“ Something.xsd” xmls:xsi =“ http://www.w3.org/2001/XMLSchema-instance ”)。我不希望JAXB以任何方式使用架构-仅存储这些属性和值。
是否有针对此的特定注释?我可以创建一个恒定的XmlAttribute,但似乎错了...
谢谢
我试图使用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) 我试图使用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提供程序.我在同一个项目中有一些其他软件包,我可以把这个文件放进去.
任何的想法 ?
谢谢.
我使用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没有解决方案,我卡住了.
我正在使用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-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附带的默认实现,只要代码执行通过这个新模块?
一些上下文:我们已将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?
jaxb ×10
java ×8
xml ×3
xsd ×3
gradle ×2
java-8 ×2
casting ×1
inheritance ×1
jaxb2 ×1
jaxb2-basics ×1
json ×1
marshalling ×1
maven ×1
memory-leaks ×1
metadata ×1
moxy ×1
spring ×1
xml-parsing ×1