Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泽西岛使用的(哈希)映射序列化程序?_Java_Json_Rest_Jersey - Fatal编程技术网

Java 泽西岛使用的(哈希)映射序列化程序?

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",

我正在尝试将以下有效负载发布到基于Jersey的web服务:

{
    "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();
}