Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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 Restlet-Post对象(即使使用Jaxb)也不起作用_Java_Rest_Jaxb_Restlet_Xstream - Fatal编程技术网

Java Restlet-Post对象(即使使用Jaxb)也不起作用

Java Restlet-Post对象(即使使用Jaxb)也不起作用,java,rest,jaxb,restlet,xstream,Java,Rest,Jaxb,Restlet,Xstream,我尝试了两种方法:将一个对象作为对象发布或包装到JAXBElement中。对我来说什么都不管用 //Create Object Estate DTO estateOne = new EstateDTO("Hotel", "StreetOne", 1, 111111, "England", 1); ///setting up xstream XStream xstream = new XStream(); xstream.processAnnotations(Estate

我尝试了两种方法:将一个对象作为对象发布或包装到JAXBElement中。对我来说什么都不管用

//Create Object
Estate DTO estateOne = new EstateDTO("Hotel", "StreetOne", 1, 111111, "England", 1);

    ///setting up xstream
    XStream xstream = new XStream();
    xstream.processAnnotations(EstateResourceIF.class);
    xstream.processAnnotations(EstateDTO.class);
    xstream.autodetectAnnotations(true);

    xstream.setClassLoader(new EstateDTO().getClass().getClassLoader());
    xstream.alias("estateDTO", EstateDTO.class);
    xstream.alias("estateId", Integer.class);
            xstream.alias("estateName", String.class);

    //post object
    service.post(estateOne).write(System.out);
我甚至试着用JAXB来包装它:

 JAXBElement<EstateDTO> estate = new JAXBElement<EstateDTO>(new QName("estate"), EstateDTO.class, estateOne);
即使我尝试使用:

EstateSourceIf EstateSource=service.wrap(EstateSourceIf.class)

科索尔的系统说

 EstateDTO [estateId=null, owner=null, estateName=null, street=null, number=0, extraAddressLine=null, zip=0, country=null, space=0, tenants=[]]
postAndGetResponse方法:

        private Response postAndGetResponse(EstateDTO estate) {
            Response res;
            System.out.println(estate);
            if(EstateDAO.instance.getEstateDao().containsKey(estate.getEstateId())) {
                res = Response.serverError().status(409).build();
            } else {
                res = Response.created(UriBuilder.fromUri(uriInfo.getAbsolutePath() + "/" + estate.getEstateId()).build()).entity(estate).build();
                EstateDAO.instance.getEstateDao().put(estate.getEstateId(), estate);
            }
            return res;
        }
依赖项:

                    <dependency>
                <groupId>org.restlet.jee</groupId>
                <artifactId>org.restlet</artifactId>
                <version>${restlet.version}</version>
        </dependency>
        <dependency>  
           <groupId>org.restlet.jee</groupId>  
           <artifactId>org.restlet.ext.xstream</artifactId>  
           <version>${restlet.version}</version>  
        </dependency>

        <dependency>  
           <groupId>org.restlet.jee</groupId>  
           <artifactId>org.restlet.ext.jackson</artifactId>  
           <version>${restlet.version}</version>  
        </dependency>

        <dependency>  
           <groupId>org.restlet.jee</groupId>  
           <artifactId>org.restlet.ext.jaxb</artifactId>  
           <version>${restlet.version}</version>  
        </dependency>

        <dependency>  
           <groupId>org.restlet.jee</groupId>  
           <artifactId>org.restlet.ext.json</artifactId>  
           <version>${restlet.version}</version>  
        </dependency>

        <dependency>  
           <groupId>org.restlet.jee</groupId>  
           <artifactId>org.restlet.ext.xml</artifactId>  
           <version>${restlet.version}</version>  
        </dependency>

        <!-- Jersey JAXB -->
         <!--   <dependency>
               <groupId>com.sun.jersey</groupId>
               <artifactId>jersey-json</artifactId>
               <version>1.12</version>
           </dependency>-->

org.restlet.jee
org.restlet
${restlet.version}
org.restlet.jee
org.restlet.ext.xstream
${restlet.version}
org.restlet.jee
org.restlet.ext.jackson
${restlet.version}
org.restlet.jee
org.restlet.ext.jaxb
${restlet.version}
org.restlet.jee
org.restlet.ext.json
${restlet.version}
org.restlet.jee
org.restlet.ext.xml
${restlet.version}

您的JAXB映射似乎是正确的,而且由于您已使用
@XmlRootElement
映射了类,因此不需要将对象包装在
JAXBElement
中。我还进行了双重检查,您的XStream映射似乎与您的JAXB映射相匹配(见下文)。我目前的猜测是问题在于你的post方法。您可以将服务中的post方法添加到您的问题中吗

EstateDTO

通过利用JAXB是异常配置,我将您的
设置简化为
类。这意味着您只需要在行为与默认映射不同的地方添加注释

套餐11410653

import java.io.Serializable;
import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
//JAX-RS supports an automatic mapping from JAXB annotated class to XML and JSON
@XmlAccessorType(XmlAccessType.FIELD)
public class EstateDTO implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -8545841080597549468L;

    private String estateId;
    private String owner;
    private String estateName;
    private String street;
    private int number;
    private String extraAddressLine;
    private int zip;
    private String country;

    private int space;
    private List<String> tenants = new ArrayList<String>();

    public EstateDTO() {
    }

    public EstateDTO(String estateName, String street, int number, int zip, String country, int space) {
        this.estateName = estateName;
        this.street = street;
        this.number = number;
        this.zip = zip;
        this.country = country;
        this.space = space;
    }

}
输出

如您所见,
estateName
街道
,以及
国家
都已填充

<estateDTO>
  <estateName>Hotel</estateName>
  <street>StreetOne</street>
  <number>1</number>
  <zip>111111</zip>
  <country>England</country>
  <space>1</space>
  <tenants/>
</estateDTO>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<estateDTO>
    <estateName>Hotel</estateName>
    <street>StreetOne</street>
    <number>1</number>
    <zip>111111</zip>
    <country>England</country>
    <space>1</space>
    <tenants></tenants>
</estateDTO>

酒店
街通
1.
111111
英格兰
1.
酒店
街通
1.
111111
英格兰
1.

您的JAXB映射似乎是正确的,而且由于您已使用
@XmlRootElement
映射了类,因此不需要将对象包装在
JAXBElement
中。我还进行了双重检查,您的XStream映射似乎与您的JAXB映射相匹配(见下文)。我目前的猜测是问题在于你的post方法。您可以将服务中的post方法添加到您的问题中吗

EstateDTO

通过利用JAXB是异常配置,我将您的
设置简化为
类。这意味着您只需要在行为与默认映射不同的地方添加注释

套餐11410653

import java.io.Serializable;
import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
//JAX-RS supports an automatic mapping from JAXB annotated class to XML and JSON
@XmlAccessorType(XmlAccessType.FIELD)
public class EstateDTO implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -8545841080597549468L;

    private String estateId;
    private String owner;
    private String estateName;
    private String street;
    private int number;
    private String extraAddressLine;
    private int zip;
    private String country;

    private int space;
    private List<String> tenants = new ArrayList<String>();

    public EstateDTO() {
    }

    public EstateDTO(String estateName, String street, int number, int zip, String country, int space) {
        this.estateName = estateName;
        this.street = street;
        this.number = number;
        this.zip = zip;
        this.country = country;
        this.space = space;
    }

}
输出

如您所见,
estateName
街道
,以及
国家
都已填充

<estateDTO>
  <estateName>Hotel</estateName>
  <street>StreetOne</street>
  <number>1</number>
  <zip>111111</zip>
  <country>England</country>
  <space>1</space>
  <tenants/>
</estateDTO>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<estateDTO>
    <estateName>Hotel</estateName>
    <street>StreetOne</street>
    <number>1</number>
    <zip>111111</zip>
    <country>England</country>
    <space>1</space>
    <tenants></tenants>
</estateDTO>

酒店
街通
1.
111111
英格兰
1.
酒店
街通
1.
111111
英格兰
1.

谢谢您的帮助。我添加了服务器端。我试过你的演示,效果不错。但仍然存在同样的问题。我无法将对象交付给我的服务,所有符号都为空,但仍然只有一半返回。图书馆有什么问题吗?我已经导入了restlet的xstream和for json/jaxb jsersey-json.Ok,正如我评论了你的文章并发布了我的库一样,我切换到了restlet jaxb/json库。我编辑了我现在对项目的依赖关系。现在这是一个新问题。创建Marshaller javax.xml.bind.JAXBException时出现问题:“com.bamber.facade.object”不包含ObjectFactory.class或jaxb.index我不得不说我的DTO对象保存在另一个模块中。我是否也应该在那里添加库?@user1189762-当您创建一个“JAXBContext”,其中包含一个表示模型包名的字符串时,就会出现这个问题。您是在显式地创建一个
JAXBContext
,还是自动创建的。你能发布完整的堆栈跟踪吗?我想它是自动完成的。我在问题中编辑了完整的堆栈跟踪。我用一个名为jaxb.index的文件解决了这个问题,我在其中声明了EstateDTO。现在它起作用了。谢谢你的帮助!谢谢你的帮助。我添加了服务器端。我试过你的演示,效果不错。但仍然存在同样的问题。我无法将对象交付给我的服务,所有符号都为空,但仍然只有一半返回。图书馆有什么问题吗?我已经导入了restlet的xstream和for json/jaxb jsersey-json.Ok,正如我评论了你的文章并发布了我的库一样,我切换到了restlet jaxb/json库。我编辑了我现在对项目的依赖关系。现在这是一个新问题。创建Marshaller javax.xml.bind.JAXBException时出现问题:“com.bamber.facade.object”不包含ObjectFactory.class或jaxb.index我不得不说我的DTO对象保存在另一个模块中。我是否也应该在那里添加库?@user1189762-当您创建一个“JAXBContext”,其中包含一个表示模型包名的字符串时,就会出现这个问题。您是在显式地创建一个
JAXBContext
,还是自动创建的。你能发布完整的堆栈跟踪吗?我想它是自动完成的。我在问题中编辑了完整的堆栈跟踪。我用一个名为jaxb.index的文件解决了这个问题,我在其中声明了EstateDTO。现在它起作用了。谢谢你的帮助!
import java.io.Serializable;
import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
//JAX-RS supports an automatic mapping from JAXB annotated class to XML and JSON
@XmlAccessorType(XmlAccessType.FIELD)
public class EstateDTO implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -8545841080597549468L;

    private String estateId;
    private String owner;
    private String estateName;
    private String street;
    private int number;
    private String extraAddressLine;
    private int zip;
    private String country;

    private int space;
    private List<String> tenants = new ArrayList<String>();

    public EstateDTO() {
    }

    public EstateDTO(String estateName, String street, int number, int zip, String country, int space) {
        this.estateName = estateName;
        this.street = street;
        this.number = number;
        this.zip = zip;
        this.country = country;
        this.space = space;
    }

}
package forum11410653;

import java.io.*;
import javax.xml.bind.*;
import com.thoughtworks.xstream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        EstateDTO estateDTO = new EstateDTO("Hotel", "StreetOne", 1, 111111,
                "England", 1);

        // setting up xstream
        XStream xstream = new XStream();
        xstream.processAnnotations(EstateDTO.class);
        xstream.autodetectAnnotations(true);

        xstream.setClassLoader(new EstateDTO().getClass().getClassLoader());
        xstream.alias("estateDTO", EstateDTO.class);
        xstream.alias("estateId", Integer.class);
        xstream.alias("estateName", String.class);
        StringWriter writer = new StringWriter();
        xstream.toXML(estateDTO, writer);

        String xml = writer.toString();
        System.out.println(xml);

        // setting up JAXB
        JAXBContext jc = JAXBContext.newInstance(EstateDTO.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        EstateDTO unmarshalled = (EstateDTO) unmarshaller
                .unmarshal(new StringReader(xml));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(unmarshalled, System.out);
    }

}
<estateDTO>
  <estateName>Hotel</estateName>
  <street>StreetOne</street>
  <number>1</number>
  <zip>111111</zip>
  <country>England</country>
  <space>1</space>
  <tenants/>
</estateDTO>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<estateDTO>
    <estateName>Hotel</estateName>
    <street>StreetOne</street>
    <number>1</number>
    <zip>111111</zip>
    <country>England</country>
    <space>1</space>
    <tenants></tenants>
</estateDTO>