我有一个JAX-RS Web服务,它使用JPA实体类.我有一个像这样的资源类:
@Path("/entity")
public class MyEntityResource
{
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("/{entity}")
public MyEntity getMyEntity(@PathParam("entity") String entity)
{
log.debug("Entering getMyEntity with param: " + entity);
MyEntity entityObject = genericService.find(MyEntity.class, entity);
if (entityObject == null)
{
log.debug("Entity not found.");
throw new WebApplicationException(Response.Status.NOT_FOUND);
}
log.debug("Exiting getMyEntity");
return entityObject;
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行该服务并对该实体进行get调用时,我收到此错误:
SEVERE: The response of the WebApplicationException cannot be utilized as the response is already committed. Re-throwing to the HTTP container
javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
- with linked exception:
[Exception [EclipseLink-25003] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): …Run Code Online (Sandbox Code Playgroud) 我用的时候 @XmlSchema(attributeFormDefault = XmlNsForm.QUALIFIED, ...)
要么@XmlAttribute(namespace = "sample.com/y", ...)
JAXB无视 @XmlSchema(namespace = "sample.com/x", ...)
而不是:
<a xmlns="sample.com/y" xmlns:ns0="sample.com/y">
<b ns0:att=""/>
</a>
Run Code Online (Sandbox Code Playgroud)
生成类似的东西:
<ns1:a xmlns:ns1="sample.com/x" xmlns:ns0="sample.com/y">
<ns1:b ns0:att=""/>
</ns1:a>
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?有没有办法纠正这个?
当我在eclipse indigo中创建一个jaxb项目时,它告诉我"当前选择的JAXB库提供程序是无效的",这是eclipselink2.3.0-Indigo我尝试了javanet下载jar但没有成功.我可以尝试这里描述的演示中的示例:http: //wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted,但MOXy自定义部分除外.我跑的时候没有错误,它似乎没有做任何事情.
我错过了什么.提前致谢.卡迈勒
我有一个包含两个列表的类.我想围绕列表元素和两个列表生成一个包装元素.
class SomeClass {
private List<TypeA> listA;
private List<TypeB> listB;
}
<some-class>
<lists>
<list-a>
<element-from-list-a />
<element-from-list-a />
<element-from-list-a />
...
</list-a>
<list-b>
<element-from-list-b />
<element-from-list-b />
<element-from-list-b />
...
</list-b>
</lists>
</some-class>
Run Code Online (Sandbox Code Playgroud)
我可以使用xml-element-wrapper在列表周围生成一个包装器,但是我不能将这两个列表包装成一个元素.
是否可以在JAXB和/或moxy实现中执行此操作?
我使用Eclipselink 2.3.2作为我的JAXB(JSR-222)提供程序.我创建了一个通用列表,其中包含一个项目列表和一组分页链接.
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "listdata")
public class ListEntity<T> {
@XmlElementRef
public List<T> data;
@XmlElementRef
public PaginationLinks links;
public ListEntity(List<T> data) {
this.data = data;
}
public ListEntity() {
}
}
Run Code Online (Sandbox Code Playgroud)
我的实际实体
@XmlRootElement(name="authorization")
public class AuthorizationDTO {
@XmlElement
public String referenceNumber;
}
Run Code Online (Sandbox Code Playgroud)
因此,在创建列表后,当我尝试编组它时,我收到以下错误.适用于List数据的@XmlElement可以正常工作,但显然无法使用,因为它会创建Object表示
Caused by: Exception [EclipseLink-50006] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.JAXBException
Exception Description: Invalid XmlElementRef on property data on class com.ofss.fc.botg.infra.model.ListEntity. Referenced Element not declared.
Run Code Online (Sandbox Code Playgroud) 在我目前的设置中,我使用Jersey 2.0和MOXy,如在球衣文档中所述.我完全依赖"Auto-Discoverable Features",所以我不使用任何额外的配置或JAXB注释.
我的任务是反序列化服务器端的字符串数组.客户端正在发送JSON消息:
["foo","bar"]
Run Code Online (Sandbox Code Playgroud)
在服务器端,以下方法头应该反序列化它:
@POST
@Path("/stringArray")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response stringArray(List<String> stringList) {
...
}
Run Code Online (Sandbox Code Playgroud)
问题: stringList的内容为{null,null},因此元素的数量始终是正确的,但字符串设置为null.
使用小包装类也是如此.这里的课程:
public static class Data {
public List<String> stringList;
}
Run Code Online (Sandbox Code Playgroud)
将methode签名更改为stringArray(数据数据)并将JSON消息更改为:
{"stringList": ["foo","bar"]}
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别,我如何才能使普通字符串数组工作?
更新: 所述问题由@Blaise的回答修复.但序列化POJO列表的密切相关的问题仍然无效.信息:
[org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型= application/json的MessageBodyWriter,type = class java.util.ArrayList,genericType = class java.util.ArrayList.]
我找到的唯一解决方案是再次使用包含List的小包装类...
我正在尝试使用Eclipselink将输入JSON解组为JAXB对象.但是,当我尝试这样做时,我发现嵌套对象最终被设置为null.我可以尝试自己解组嵌套对象,它将一直工作,直到它必须解组另一个嵌套对象,然后再设置为null.
例如,参加这个课程:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "event", propOrder = {
"objectBs"
})
public class ObjectA
implements Serializable
{
private final static long serialVersionUID = 56347348765454329L;
@XmlElement(required = true)
protected ObjectA.ObjectBs objectBs;
public ObjectA.ObjectBs getObjectBs() {
return objectBs;
}
public void setObjectBs(ObjectA.ObjectBs value) {
this.objectBs = value;
}
public boolean isSetObjectBs() {
return (this.objectBs!= null);
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"objectB"
})
public static class ObjectBs
implements Serializable
{
private final static long serialVersionUID = 56347348765454329L;
@XmlElement(required = true) …Run Code Online (Sandbox Code Playgroud) 我有一个问题是让Moxy为继承对象列表生成"好"的XML和JSON.XML查找或JSON看起来都很好,但不是同时.这是模型:
public static abstract class Animal {
private String name;
protected Animal() {
}
protected Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@XmlRootElement
public static class Tiger extends Animal {
public Tiger() {
}
public Tiger(String name) {
super(name);
}
}
@XmlRootElement
public static class Lion extends Animal {
public Lion() {
}
public Lion(String name) {
super(name);
}
}
@XmlRootElement
public static …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多Blaise Doughan的StackOverflow答案和博客文章,我想我理解他使用@XmlAnyElement和Object []的例子.
但是相同的原则似乎不适用于List - 如下面的示例所示(部分从他的一个示例复制,部分从xjc输出复制).
我相信下面的代码应该创建JSON:
{"method":"test","status":["value":"500"]}
Run Code Online (Sandbox Code Playgroud)
但它正在创建JASON:
{"method":"test","value":["com.mdsh.test.JsonRequestTest$Status@64dbfe37"]}
Run Code Online (Sandbox Code Playgroud)
这对我没有多大用处.
任何人都可以指导我正确地编组这个小物件吗?
package com.mdsh.test;
import static org.junit.Assert.assertEquals;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.junit.Test;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
public class JsonRequestTest
{
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Request
{
String method;
@XmlAnyElement(lax = true)
protected List<Object> any = new Vector<Object>();
public String getMethod()
{
return this.method;
} …Run Code Online (Sandbox Code Playgroud) 假设我有一个数据模型,如:
public class MyModel {
private String someString;
private String someJson; // Data structure owned by client, persisted as a CLOB
}
Run Code Online (Sandbox Code Playgroud)
我通过REST API(Jersey)向客户端提供模型.我知道我可以通过以下方式整理/解组:
{
"someStrong": "foo",
"someJson": "{ someClientThing: \"bar\", someOtherClientThing: \"baz\"}"
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找更清洁的东西.有没有办法可以像这样把JSON编组/解组?
{
someStrong: "foo",
someJson: {
someClientThing: "bar",
someOtherClientThing: "baz"
}
}
Run Code Online (Sandbox Code Playgroud)
我不希望服务器必须知道数据模型someJson,因为它由客户端拥有.我只是希望服务器处理它的持久性 - 所以服务器会在客户端和数据库之间来回传递它.
注意:它不需要直接映射到字符串 - 只要它可以映射到非结构化的(在服务器上没有静态定义),可以在持久化之前进行字符串化(并且在检索时将其解析为非结构化对象).
moxy ×10
jaxb ×8
eclipselink ×5
java ×4
json ×4
jersey ×2
inheritance ×1
jax-rs ×1
jaxb2 ×1
jpa ×1
marshalling ×1
xml ×1