如何使REST服务处理响应中的自定义对象?

时间:2014-01-06 23:06:48

标签: java rest marshalling resteasy unmarshalling

如何使restful Response中的自定义对象看起来像本机类型。换句话说,我不想使用getter和setter,而是让对象marshal和unmarshall就像一个字符串。我可以使用构造函数进行unmarshall,但我不知道如何通过服务的响应来获取对象。当我运行示例时,我得到了这个结果:

<data>
  <nType>123</nType>
  <myType/>
  <notMyType>
    <value>def</value>
  </notMyType>
</data>

我想让myType看起来像nType。这是一个简短的代码示例:

package rscust;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.xml.bind.annotation.XmlRootElement;

@Path("/")
public class Service extends Application {

    @XmlRootElement
    public static class Data {
        public String nType;
        public MyType myType;
        public NotMyType notMyType;
        public Data() {}
    }

    // custom class does not work in Response
    public static class MyType {
        private String value;
        public MyType() {}
        public MyType(String value) {
            this.value=value;
        }
        public String toString() {
            return value;
        }
    }

    // works with getter and setter, but I don't want that
    public static class NotMyType {
        private String value;
        public NotMyType() {}
        public NotMyType(String value) {
            this.setValue(value);
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
    }

    @GET
    @Produces(value={MediaType.APPLICATION_XML})
    public Response get(
            @QueryParam(value = "ntype")String nType,
            @QueryParam(value = "mytype")MyType myType, 
            @QueryParam(value = "notmytype")NotMyType notMyType
    ) {
        Data data = new Data();
        data.nType = nType;
        data.myType = myType;
        data.notMyType = notMyType;
        return Response.ok().entity(data).build();

    }

    private HashSet<Object> singletons;
    public Service() {
        super();
        singletons = new HashSet<Object>();
        singletons.add(this);
    }
    public Set<Object> getSingletons() {
        return singletons;
    }
}

2 个答案:

答案 0 :(得分:3)

答案是您需要向自定义类添加注释,以告诉它如何反序列化和序列化不同的字段。您的get方法看起来很好,但自定义类根本没有注释。 MyType和NotMyType还应该有@ XmlRootElement和注释来标记哪些字段是@Transient,哪些是@JsonProperty

@XmlRootElement
    public static class Data {
        @JsonProperty
        public String nType;
        @JsonProperty
        public MyType myType;
        @JsonProperty
        public NotMyType notMyType;
        public Data() {}
    }

@XmlRootElement
public static class MyType {
        @JsonProperty
        private String value;
        public MyType() {}
        public MyType(String value) {
            this.value=value;
        }
        public String toString() {
            return value;
        }
    }

另外,既然你已经将这些对象作为Data的一部分,只需要请求一个数据对象,然后就可以从那里拉出其他对象。

public Response get( @QueryParam(value = "data")Data d,){
Data d = data.nType;
}

答案 1 :(得分:0)

如果你不习惯使用getter和setter,那么你需要设置字段'public'。因为RESTeasy需要访问字段。