我正在使用Jersey为服务器组件创建REST Web服务.
我想在列表中序列化的JAXB注释对象如下所示:
@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
"id", "name"
})
public class XMLDistribution {
private String id;
private String name;
// no-args constructor, getters, setters, etc
}
Run Code Online (Sandbox Code Playgroud)
我有一个REST资源来检索一个看起来像这样的发行版:
@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
@GET
@Produces("application/json")
public XMLDistribution retrieve(@PathParam("id") String id) {
return retrieveDistribution(Long.parseLong(id));
}
// business logic (retrieveDistribution(long))
}
Run Code Online (Sandbox Code Playgroud)
我还有一个REST资源来检索所有发行版的列表,如下所示:
@Path("/distributions")
public class RESTDistributions {
@GET
@Produces("application/json")
public List<XMLDistribution> retrieveAll() {
return retrieveDistributions();
}
// business logic (retrieveDistributions())
}
Run Code Online (Sandbox Code Playgroud)
我使用ContextResolver来自定义JAXB序列化,当前配置如下:
@Provider
@Produces("application/json")
public class …Run Code Online (Sandbox Code Playgroud) 我有一个使用Jersey构建的REST服务,并部署在AppEngine中.REST服务实现使用application/json媒体类型的动词PUT.数据绑定由Jackson执行.
动词使用JSON表示的企业部门关系
{"name":"myEnterprise", "departments":["HR","IT","SC"]}
Run Code Online (Sandbox Code Playgroud)
在客户端,我使用gson将JSON表示转换为java对象.然后,我将对象传递给我的REST服务,它工作正常.
问题:
当我的JSON表示在集合中只有一个项目时
{"name":"myEnterprise", "departments":["HR"]}
Run Code Online (Sandbox Code Playgroud)
该服务无法反序列化该对象.
ATTENTION: /enterprise/enterprise: org.codehaus.jackson.map.JsonMappingException:
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at
[Source: org.mortbay.jetty.HttpParser$Input@5a9c5842; line: 1, column: 2
Run Code Online (Sandbox Code Playgroud)
正如其他用户所报告的那样,解决方案是添加标志ACCEPT_SINGLE_VALUE_AS_ARRAY(例如,Jersey:无法从String中反序列化ArrayList的实例).然而,我并不是在控制ObjectMapper,因为在服务方面它是由Jackson透明地制作的.
题:
有没有办法在服务端配置ObjectMapper以启用ACCEPT_SINGLE_VALUE_AS_ARRAY?注释?web.xml中?
代码细节
Java对象:
@XmlRootElement
public class Enterprise {
private String name;
private List<String> departments;
public Enterprise() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getDepartments() {
return departments;
}
public void setDepartments(List<String> departments) {
this.departments …Run Code Online (Sandbox Code Playgroud) Url,Credentials在RestClient UI以及Curl中工作,因为当通过Spring RestTemplate访问相同内容时,我遇到"500"错误.
我使用以下代码:
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("name", user);
map.add("password", password);
restTemplate.postForObject(url, request, Employee.class, map);
Run Code Online (Sandbox Code Playgroud)
请告诉我您的建议或意见以解决问题.
我正在运行Jersey REST服务.代表我的资源的POJO是JAXB(XML)带注释的简单Java类(它们是从模式定义生成的 - 因此它们具有注释).
我希望Jersey/Jackson忽略XML-Annotations.我在我的web.xml中做了这个配置(如这里提到的):
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)
我现在预计@ZMLElement注释将不再用于JSON字段命名策略.
但是看看这个java字段(成员)
@XmlElement(name = "person", required = true)
protected List<Person> persons;
Run Code Online (Sandbox Code Playgroud)
我仍然得到以下JSON表示:
....,"person":[{"name":"FooBar", ....... (person without the 's')
Run Code Online (Sandbox Code Playgroud)
所有其他字段仍然从@XmlElement注释中获取其JSON名称,而不是从Java字段名称获取.
我想实现杰克逊完整数据绑定(POJO)示例中描述的JSON输出.
它在这样的简单测试中工作正常(使用我的XML注释类):
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, myObject);
Run Code Online (Sandbox Code Playgroud)
但嵌入在泽西岛我没有得到预期的JSON输出.
他们在Jersey中的其他配置选项是否获得"简单"POJO JSON表示(因为这最适合必须反序列化JSON结果的客户端).
谢谢克劳斯
详细解决方案
(1)ContextResolver为Jacksons 实现一个ObjectMapper创建不使用注释的ObjectMapper的Jacksons .
package foo.bar.jackson;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
/**
* Customized {@code ContextResolver} implementation that does not use any …Run Code Online (Sandbox Code Playgroud) 我正在使用JAXB/Jersey(1.3)在REST API中将java转换为json.我读了很多关于这个问题,我尝试了这个解决方案,它工作了一半:
@XmlRootElement
public class ArrayWrapper
{
public List<String> list = new LinkedList<String>();
}
Run Code Online (Sandbox Code Playgroud)
和我的ContextResolver:
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
private Class[] types = {ArrayWrapper.class,Wrapper.class};
public JAXBContextResolver() throws Exception {
MappedBuilder builder = JSONConfiguration.mapped();
builder.arrays("list");
builder.rootUnwrapping(true);
this.context = new JSONJAXBContext(builder.build(), types);
}
Run Code Online (Sandbox Code Playgroud)
ArrayWrapper aw = new ArrayWrapper();
aw.list.add( "测试");
我得到{"list":["test"]}所以它可以工作但是当我在其他类中包装ArrayWrapper时它不起作用:
@XmlRootElement
public class Wrapper
{
public ArrayWrapper aw;
public Wrapper()
{
aw=new ArrayWrapper();
aw.list.add("test");
}
}
Run Code Online (Sandbox Code Playgroud)
new Wrapper();
我得到{"aw":{"list":"test"}}
谁知道怎么修它?
美好的一天,
我目前正在集成尝试使用Jackson(使用Jersey)使用生成JSON(用.NET编写)的REST服务.JSON由可能的错误消息和对象数组组成.下面是Jersey的日志记录过滤器返回的JSON示例:
{
"error":null,
"object":"[{\"Id\":16,\"Class\":\"ReportType\",\"ClassID\":\"4\",\"ListItemParent_ID\":4,\"Item\":\"Pothole\",\"Description\":\"Pothole\",\"Sequence\":1,\"LastEditDate\":null,\"LastEditor\":null,\"ItemStatus\":\"Active\",\"ItemColor\":\"#00AF64\"}]"
}
Run Code Online (Sandbox Code Playgroud)
我有两个类来表示类型(外部ListResponse):
public class ListResponse {
public String error;
public ArrayList<ListItem> object;
public ListResponse() {
}
}
Run Code Online (Sandbox Code Playgroud)
和(内部ListItem):
public class ListItem {
@JsonProperty("Id")
public int id;
@JsonProperty("Class")
public String classType;
@JsonProperty("ClassID")
public String classId;
@JsonProperty("ListItemParent_ID")
public int parentId;
@JsonProperty("Item")
public String item;
@JsonProperty("Description")
public String description;
@JsonAnySetter
public void handleUnknown(String key, Object value) {}
public ListItem() {
}
}
Run Code Online (Sandbox Code Playgroud)
调用并返回JSON的类如下所示:
public class CitizenPlusService {
private Client client = null;
private WebResource service = null;
public …Run Code Online (Sandbox Code Playgroud)