我是JAXB的新手,我想使用EclipseLink MOXy更改默认的名称空间前缀.我的package-info.java包含以下代码行:
@javax.xml.bind.annotation.XmlSchema (
namespace="http://namespace.mysite.com/",
xmlns = {
@javax.xml.bind.annotation.XmlNs(prefix="myns",
namespaceURI="http://namespace.mysite.com/")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED
)
package com.core.mymodel;
Run Code Online (Sandbox Code Playgroud)
我的jaxb.properties文件包含以下行:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
我已将eclipselink.jar添加到CLASSPATH,package-info.java和jaxb.properties文件与我的模型类位于同一个包中,但是,当我运行该程序时,我收到以下错误消息:
javax.xml.bind.JAXBException: Provider org.eclipse.persistence.jaxb.JAXBContextFactory not found
- with linked exception:
[java.lang.ClassNotFoundException: org.eclipse.persistence.jaxb.JAXBContextFactory]
at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
at javax.xml.bind.ContextFinder.find(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用EclipseLink版本2.3.0和2.0.2并仍然得到相同的错误消息.有谁碰巧知道可能是什么问题?
提前谢谢了
我正在使用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>这是不可取的,我不知道为什么它是这样做的.
如何通过JAX WS Web服务发送JPA生成的实体,而不会因为这些实体中的引用循环而获得XML无限循环异常?
任何的想法?我发现这个MOXy可以做到......部分.但是我已经生成了实体,并且手动将XmlTransient和这样的注释添加到每个实体中都很疯狂.
你还有其他想法怎么做吗?
谢谢!
我正在尝试使用MOXy JAXB来序列化类A,它看起来像:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
public class A {
private Map<Foo, Bar> fooBar = new HashMap<Foo, Bar>();
private Set<Foo> foos = new HashSet<Foo>();
@XmlJavaTypeAdapter(FooBarMapAdapter.class)
public Map<Foo, Bar> getFooBar() {
return fooBar;
}
public void setFooBar(Map<Foo, Bar> fooBar) {
this.fooBar = fooBar;
}
@XmlElement
public Set<Foo> getFoos() {
return foos;
}
public void setFoos(Set<Foo> foos) {
this.foos = foos;
}
}
Run Code Online (Sandbox Code Playgroud)
关键是"foos"字段中的Foo对象是fooBar映射中的Foo对象的超集.因此,我想将"fooBar"映射的关键元素"链接"到"foos"列表中的相应元素.我使用XmlID和XmlIDREF注释尝试了这个:
@XmlAccessorType(XmlAccessType.NONE)
public class Foo {
private String xmlId;
@XmlID
@XmlAttribute
public String getXmlId() {
return xmlId;
}
public void setXmlId(String …Run Code Online (Sandbox Code Playgroud) 我可以成功地将XML数据发布到我的服务中,但是,尝试使用JSON执行相同操作失败了.POJO是:
@XmlRootElement
public class Address {
String city;
String zip;
//Getters & setters...
}
Run Code Online (Sandbox Code Playgroud)
服务资源是:
@POST
@Produces("application/json")
public Address fix(Address a) {
return a;
}
Run Code Online (Sandbox Code Playgroud)
我按照以下方式进行POST:
POST /AcmeWeb/svc/simple HTTP/1.1
Content-Length: 30
Content-Type: application/json; charset=UTF-8
{"city":"Miami","zip":"33130"}
Run Code Online (Sandbox Code Playgroud)
服务器正在响应400 Bad Request.我搜索了互联网,但没有找到发布JSON的好例子.任何帮助表示赞赏.谢谢.
对象模型的元素结尾为String类型
public class LifeSpan {
protected String begin;
protected String end;
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
protected String ended;
....
Run Code Online (Sandbox Code Playgroud)
但实际上它只是一个布尔值,(我不知道XmlJavaTypeAdapter批注的意义)
当输出为XML时
<life-span><begin>1999-04</begin><ended>true</ended></life-span>
Run Code Online (Sandbox Code Playgroud)
所以定义为布尔值还是字符串都没有关系
但是JSON输出是
"life-span" : {
"begin" : "1999-04",
"ended" : "true"
},
Run Code Online (Sandbox Code Playgroud)
当我需要它时
"life-span" : {
"begin" : "1999-04",
"ended" : true
},
Run Code Online (Sandbox Code Playgroud)
我无法真正更改对象模型,因此以为我可以映射到oxml.xml文件中的正确类型,并尝试了
<java-type name="LifeSpan">
<java-attributes>
<xml-element java-attribute="ended" type="boolean"/>
</java-attributes>
</java-type>
Run Code Online (Sandbox Code Playgroud)
但它不是那样。
该jaxb.properties需求是在同一个封装领域类,你是在创建JAXBContext中.
我正在使用Moxy的xml驱动配置,因为我不想使用注释或XJC生成的对象.我有一个分布在多个包中的现有域类.这是否意味着我需要jaxb.properties在所有这些包中拥有现在或者有更好的替代方案(也许编写我自己的一些可以从jvm arg或其他东西读取的接口的实现)?
我们有一个在Apache TomEE上运行的JAX-RS应用程序.我们稍微定制默认的Jettison提供程序,以更好地遵守JavaScript前端使用的JSON约定.TomEE允许通过其resources.xml文件执行此操作:
<resources>
<Service id="jettison" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider">
serializeAsArray = true
dropRootElement = false
arrayKeys = members,roles
supportUnwrapped = true
writeXsiType = false
</Service>
</resources>
Run Code Online (Sandbox Code Playgroud)
现在我们正在迁移到GlassFish v4.1,我们注意到JSON输出与我们在TomEE中的输出不同 - 因此完全打破了前端.我正在寻找类似的机制来自定义GlassFish中的JSON编组器.事实上,我已经有点坚持与新泽西州,莫西,杰克逊,抛弃.我们如何知道实际使用哪个JSON提供程序?我们如何选择一个?我们如何定制行为?
该应用程序是纯JAX-RS,不直接使用任何JSON处理器,而是依赖于JAXB注释类的编组.引入任何非JavaEE依赖项是非常不受欢迎的,因为该应用程序旨在跨容器移植(TomEE,GlassFish,某天WildFly).配置文件方法,类似于TomEE,是优选的; 程序化方式也是可以接受的 - 但只有在保持可移植性的情况下.
MOXy BeanValidation使我能够为我的JAXB类添加验证.
使用MOXy的"Bean Validation Plugin"我可以根据来自现有 Schema的限制/方面在生成的JAXB类中进行Bean Validation .
但是有没有办法根据来自JAXB注释的java类的 Bean Validation注释生成带有限制/方面的模式?
XJC在执行'schema first'生成java时有一个方便的插件架构,但有没有任何等效的'java first'方法来增强生成的XSD带有额外的限制,甚至添加XML注释?在MOXy或JAXB-RI中?
MOXy非常灵活,可以在中间映射中使用,可以在模式生成期间使用吗?
该JAXB刻面的项目似乎做我想要什么,但实施者不得不叉一个全新JAXB-RI在得到它,它似乎不会很快通过的任何时间.(见这个Java JIRA)
我尝试了@ m0mus指定的分辨率,但必须使用sonatype存储库中的2.7.0-SNAPSHOT版本.我还有几个问题; 1.我必须用@XmlElement注释java字段以使facet出现在xsd中.@XmlAttribute,@ XmlAccessorType(XmlAccessType.FIELD)没有任何区别.@Pattern没有用; 我不得不在Pattern.List中使用单个Pattern.
@XmlElement
@Pattern.List(value = { @Pattern(regexp="[0-9]*") })
public String phoneNumber2;
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅EclipseLink论坛
我有一个REST客户端和服务器(Jersey)通过JSON消息进行通信.在将Jackson从切换到MOXy后,我开始接受XMLMarshalException: No descriptor found while unmarshalling element mapped to attribute someAttribute.
该元素在JSON中查找如下:
"someAttribute": [{
"type": "string",
"value": "a string"
}]
相应的Java元素List<Object> someAttribute;使用标准的getter和setter方法.
但是,如果我在客户端(发送数据)使用Jackson,则会发送不带类型的相同数据并通过MOXy正确反序列化:
"someAttribute": ["a string"]
为什么MOXy无法处理自己的JSON,我该如何解决这个问题呢?
MOXy 2.6.0
javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.readFrom(MOXyJsonProvider.java:708)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271)
at org.glassfish.jersey.server.internal.inject.EntityParamValueFactoryProvider$EntityValueFactory.provide(EntityParamValueFactoryProvider.java:96)
at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:94)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) …Run Code Online (Sandbox Code Playgroud)