Java 泽西岛使用的(哈希)映射序列化程序?
我正在尝试将以下有效负载发布到基于Jersey的web服务:Java 泽西岛使用的(哈希)映射序列化程序?,java,json,rest,jersey,Java,Json,Rest,Jersey,我正在尝试将以下有效负载发布到基于Jersey的web服务: { "firstname":"Jimmy", "lastname":"Johns", "addresses": [ { "street":"19 Mayberry Drive", "city":"Mayberry", "state":"nc", "postalcode":"27043",
{
"firstname":"Jimmy",
"lastname":"Johns",
"addresses":
[
{
"street":"19 Mayberry Drive",
"city":"Mayberry",
"state":"nc",
"postalcode":"27043",
"country":"us",
"addresstype":1
}
],
"data":
{
"eyes":"blue",
"hair":"brown",
"sandwich":"roast beef"
}
}
我的球衣代码:
@POST
public Response create( Person person )
{
createBo( person ); <------- stopped here in debugger
...
@POST
公众响应创建(个人)
{
createBo(个人);注意:我是专家组的负责人和成员
如果您使用的是MOXy,那么下面的方法可以使用,并且应该与任何其他JAXB提供程序一起使用。这种方法使用XmlAdapter
将java.util.Map
转换为org.w3c.dom.Element
MapAdapter
XmlAdapter
允许您将一个类的实例封送为另一个类的实例(请参阅:)
地址
package forum11353790;
import java.io.Serializable;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Address implements Serializable {
private String street;
private String city;
private String state;
private String country;
private String postalcode;
private Integer addresstype;
}
jaxb.properties
package forum11353790;
import java.io.Serializable;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Address implements Serializable {
private String street;
private String city;
private String state;
private String country;
private String postalcode;
private Integer addresstype;
}
要将MOXy指定为JAXB提供程序,您需要在与域模型相同的包中包含一个名为JAXB.properties
的文件,其中包含以下条目(请参阅:)
演示
下面是一个独立的示例,您可以运行它来证明一切正常
package forum11353790;
import java.io.FileInputStream;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String,Object>(2);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Person.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource(new FileInputStream("src/forum11353790/input.json"));
Person person = unmarshaller.unmarshal(json, Person.class).getValue();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
MOXy和JAX-RS/Jersey
通过利用MOXyJsonProvider
类,可以在JAX-RS环境中利用MOXy:
Jackson为您提供了该功能。您可以通过将以下内容添加到应用程序类中来强制执行该功能。请注意,此可能会禁用@Path
注释类的自动定位
@Override
public Set<Object> getSingletons() {
return ImmutableSet
.<Object> builder()
.add(new JacksonJaxbJsonProvider(new ObjectMapper(),
JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS)).build();
}
@覆盖
公共集getSingleton(){
返回不可变表集
.builder()
.add(新的JacksonJaxbJsonProvider(新的ObjectMapper()),
JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS)).build();
}
谢谢你的快速和令人印象深刻的回答。我正在尝试你的演示。我似乎不能把我的手放在含有Or.Eclipse。坚持。JAXB.JAXBCONTeXT属性的jar上。我需要吞下整个MOXY/Eclipse下载吗?或者我可以只消耗一个jar(或几个)吗??@RussBateman-你需要EclipseLink 2.4.0安装程序或来自的捆绑包。如果你熟悉Maven,你可以做类似的事情:简言之,我已经在EclipseLink中为这个符号提供了所有源代码和jar文件,但到目前为止都没有用。(我不使用Maven。)我下载了EclipseLink 2.1.0('因为我用的是太阳神而不是朱诺--这有区别吗?)另外,正如前面提到的,项目限制使我很难走完整个框架路线。再说一次,我必须吞下所有EclipseLink还是我可以选择这一个功能?我可以走这条路来看看这个解决方案,但如果我不能选择,我将不得不找到另一个解决方案。谢谢(对这里的跛脚表示抱歉)@RussBateman-您需要安装EclipseLink 2.4。您可以使用EclipseLink.jar(所有EclipseLink),或以下捆绑包:core、moxy、antlr和asm。我已将EclipseLink添加到我活跃的Eclipse论坛中,但我已成功地将此解决方案集成到我的Jersey ReST服务器应用程序中。它工作完美,完全满足我的樱桃采摘要求。对于此解决方案,Blaise,我感激不尽!
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
package forum11353790;
import java.io.FileInputStream;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String,Object>(2);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Person.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource(new FileInputStream("src/forum11353790/input.json"));
Person person = unmarshaller.unmarshal(json, Person.class).getValue();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
{
"firstname" : "Jimmy",
"lastname" : "Johns",
"addresses" : [ {
"street" : "19 Mayberry Drive",
"city" : "Mayberry",
"state" : "nc",
"country" : "us",
"postalcode" : "27043",
"addresstype" : 1
} ],
"data" : {
"sandwich" : "roast beef",
"hair" : "brown",
"eyes" : "blue"
}
}
@Override
public Set<Object> getSingletons() {
return ImmutableSet
.<Object> builder()
.add(new JacksonJaxbJsonProvider(new ObjectMapper(),
JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS)).build();
}