如何使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;
}
}
答案 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需要访问字段。