在过去的几天里,我尝试使用MOXy JAXB来支持Hibernate模型的XML编组/解组.试图这样做,我遇到了hibernates代理对象的问题.考虑类似的事情:
public class User {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "address")
public Address getAddress() {
return address;
}
}
public abstract class Address {
// Something
}
public class CoolAddress extends Address {
public String getSomething() {
return something;
}
}
Run Code Online (Sandbox Code Playgroud)
我试图使用MOXy JAXB以下列方式映射此代码:
@XmlAccessorType(XmlAccessType.NONE)
public class User {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "address")
@XmlElement
public Address getAddress() {
return address;
}
}
@XmlAccessorType(XmlAccessType.NONE)
@XmlSeeAlso(CoolAddress.class)
public abstract class Address {
// Something
}
@XmlAccessorType(XmlAccessType.NONE)
public class CoolAddress extends Address …Run Code Online (Sandbox Code Playgroud) 我正在使用MOXy的JAXB实现和外部元数据绑定文件来面对涉及继承和多态的编组/解组问题.
我无法控制XML文件或模型类.
模型中有多个继承其他DTO类的类.以下是我正在使用的环境示例.此示例仅用于某些语法目的,真实环境涉及嵌套继承,集合等.
这是将继承的类
class A {
private String name;
public String getName(){
return name;
}
public void setName(String value){
name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个继承的类
class B extends A {
private String attrFromB;
public String getAttrFromB(){
return attrFromB;
}
public void setAttrFromB(String value){
attrFromB = value;
}
}
Run Code Online (Sandbox Code Playgroud)
而另一个
class C extends A {
private String attrFromC;
public String getAttrFromC(){
return attrFromC;
}
public void setAttrFromC(String value){
attrFromC= value;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个容器类
class MyContainerClass{
private A myObject;
public A …Run Code Online (Sandbox Code Playgroud) 我正在使用JAXB 2.2.5从JAXB模型输出Xml,数据从数据库中填充,有时数据库包含不可显示的字符,它不应该像
0x1a
Run Code Online (Sandbox Code Playgroud)
如果确实如此,那么JAXB通过输出这个char来输出无效的Xml,它不应该逃脱它或者其他东西吗?
更新
我想知道是否有任何实现可以解决这个问题,也许Eclipselink MOXy呢?
编辑
我尝试了解决非法char问题的解决方法,但它以不合需要的方式更改输出.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><metadata created="2013-02-27T11:40:04.009Z" xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0"><cdstub-list count="1" offset="0"><cdstub id="w237dKURKperVfmckD5b_xo8BO8-" ext:score="100"><title>fred</title><artist></artist><track-list count="5"/></cdstub></cdstub-list></metadata>
Run Code Online (Sandbox Code Playgroud)
至
<?xml version="1.0" ?><metadata xmlns:ext="http://musicbrainz.org/ns/ext#-2.0" xmlns="http://musicbrainz.org/ns/mmd-2.0#" created="2013-02-27T11:39:15.394Z"><cdstub-list count="1" offset="0"><cdstub id="w237dKURKperVfmckD5b_xo8BO8-" ext:score="100"><title>fred</title><artist></artist><track-list count="5"></track-list></cdstub></cdstub-list></metadata>
Run Code Online (Sandbox Code Playgroud)
即<track-list count="5"/>已经成为<track-list count="5"></track-list>这是不可取的,我不知道为什么它是这样做的.
我目前尝试在WebLogic Server 12c中运行Docx4j.WebLogic Server 12c随EclipseLink 2.3.2一起提供.
有一个类似的帖子描述了情况,遗憾的是没有答案.
Docx4j不适用于EclipseLink 2.3.2中的JAXB(MOXy)实现.我使用EclipseLink 2.5让Docx4j独立运行.所以我非常有信心将EclipseLink 2.5与Weblogic Server 12c一起使用将解决Docx4j的问题.
如何使用EclipseLink Version 2.5替换运行WebLogic Server 12c的EclipseLink Vesion 2.3.2?
当我尝试使用Eclipse Moxy将类编组为JSON时,我遇到了一个非常恼人的错误.
我的一个域类中有一个具有以下值的属性:"the City’s original city site"其中包含代码点u + 2019(')
当Jaxb试图编组这个值时,我莫名其妙地找回了一个奇怪的控件: "Citys original city site"
这会导致无效的JSON在解码时返回空值.我和杰克逊一起尝试了这个,并且收到了一个ascii转义字符,这仍然是错误的,但它至少会产生有效的JSON!
Moxy应该能够正确输出,因为'是一个有效的unicode字符,并且在JSON中是有效的.我能做些什么来正确输出'(和任何其他unicode字符),最好将这个不必要的字符转换为常规撇号.
这是我的提供者类:
@Provider
@Component("customMOXyJsonProvider")
public class CustomMOXyJsonProvider extends MOXyJsonProvider {
@Override
protected void preWriteTo(Object object, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller)
throws JAXBException {
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Moxy的2.5.1版本.
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我的系统中有几个组件理论上可能搞砸了这些值(postgres,jdbc,hibernate,cxf和tomcat),但我已经通过测试确定该值正确存储在我的域类中 - 然后损坏,就像Elliot Spitzer一样在编组阶段,拜访一名妓女.
我按照这个例子:http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JSON_Twitter
现在我有这个课:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.MarshallerProperties;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty("eclipselink.media-type", "application/json");
unmarshaller.setProperty("eclipselink.json.include-root", false);
StreamSource source = new StreamSource("http://test.url/path/to/resource");
JAXBElement<Foo> jaxbElement = unmarshaller.unmarshal(source, Foo.class);
System.out.println(jaxbElement.getValue().getFoo());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.setProperty("eclipselink.json.include-root", false);
marshaller.marshal(jaxbElement, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
我有jaxb.properties:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
如果我运行此代码,我得到:
Exception in thread "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json …Run Code Online (Sandbox Code Playgroud) 我有一组JAXB生成的类,有些类有setter方法,它接受"Object"作为参数.例如:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Car", propOrder = {
"defaultCar"
}
public class Car {
@XmlElement(name = "DefaultCar")
protected Object defaultcar;
public void setDefaultCar(Object value) {
this.defaultCar = value;
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中创建了这些类的实例后,我调用setter方法传递所需的值.虽然方法的参数是Object,但值最有可能是字符串(我无法控制它的定义方式).但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型匹配.代码看起来像这样:
Object value = "Old Banger";
Method method = aCar.getClass().getMethod("setDefaultCar", Object.class);
method.invoke(aCar, value);
Run Code Online (Sandbox Code Playgroud)
当我编写Java对象时,我在生成的XML中得到以下内容,就在字符串的值前面:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string"
我在某处读到了方法参数类型与传递给它的内容之间不匹配的数据类型.在我的例子中,方法参数是"对象",但我传入一个字符串给它(虽然我把它转换为对象).我也看过这篇文章,它看起来与我的问题类似:
JAXB生成的xml中的"xsi:type"和"xmlns:xsi"
但是,它无助于我解决我的问题.有没有办法删除这些对xmlns的引用:xsi和xsi:type?
谢谢
根据https://gist.github.com/VineetReynolds/5108580,JAXB规范要求注释的元素@XmlID为String.MOXy在2.5.x版本中没有强制执行此操作.但是,
对于2.6.0版本,它似乎不再受支持了.
[Exception [EclipseLink-50016] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.JAXBException
Exception Description: Property [id] has an XmlID annotation but its type is not String.]**strong text**
Run Code Online (Sandbox Code Playgroud)
这是一种想要的行为,还是一种不必要的回归?
从MOXy 2.5.x迁移时,避免此类错误的正确方法是什么?
是否@XmlJavaTypeAdapter按照本文中的描述使用JAXB编组一个长基本类型,这也影响了对象本身(及其ID)如何序列化为JSON的方式(例如,类型的id字段Long变为json字符串?
我正在尝试使用具有以下结构的MOXy json解组:
[
{
"page": 1,
"pages": 1
},
[
{
"indicator": {
"id": "IC.BUS.EASE.XQ",
"value": "Ease of doing business index"
},
"country": {
"id": "1A",
"value": "Arab World"
},
"value": "113.952380952381",
"date": "2014"
},
...
]
]
Run Code Online (Sandbox Code Playgroud)
数组的第一个元素是一个对象,第二个元素是另一个复杂元素数组.我真的在SO和MOXy文档中搜索了一个类似的例子而没有任何成功.
我将json文档映射到JAVA类的最佳尝试如下.根类是CountryDataResponse(getters&setters ommited):
@XmlRootElement
@XmlType(propOrder ={"paginationInfo", "dataArray"})
public class CountryDataResponse {
private DataArray dataArray;
private PaginationInfo paginationInfo;
}
Run Code Online (Sandbox Code Playgroud)
(我可以看到这会失败,因为它不是一个数组,但我完全迷失了.)
PaginationInfo类为根数组的第一个元素建模,DataArray类包装第二个元素,即第二个元素数组.另外,我为每个Data元素中的复杂类型创建了Indicator和Country类.
主要类别(指标和国家省略):
@XmlRootElement(name = "paginationInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class PaginationInfo {
private int page;
private int pages;
}
Run Code Online (Sandbox Code Playgroud)
@XmlRootElement( name = "dataArray" )
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试将JAXB注释放在POJO上以生成以下JSON(通过moxy):
{
"apartmentNumber": "404",
"city/town": "SomeCity",
"state/province": "NoState",
"street": "1st Street"
}
Run Code Online (Sandbox Code Playgroud)
某些字段包含斜杠.当我试图把注释@XmlElement(name ="city/town")
@XMLRootElement
public class SubscriberAddress {
private String street;
private String apartmentNumber;
@XMLElement(name="city/town")
private String city;
@XMLElement(name="state/province")
private String state;
}
Run Code Online (Sandbox Code Playgroud)
moxy将这些名称视为XPath并创建以下JSON
{
"apartmentNumber" : "404",
"city" : {
"town" : "SomeCity"
},
"state" : {
"province" : "NoState"
},
"street" : "1st Street"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法逃避斜线/禁止moxy处理元素名称中的斜杠?
moxy ×10
jaxb ×9
java ×6
eclipselink ×4
json ×4
marshalling ×2
xml ×2
docx4j ×1
eclipse ×1
hibernate ×1
inheritance ×1
lazy-loading ×1
polymorphism ×1
proxy ×1
utf-8 ×1
weblogic12c ×1