JAXB 在解组后创建空 TreeSet
我有一个 RESTful 服务客户端。该服务返回 SortedSet
,其中 Movie
是 JAXB 带注释的类。生成的 XML 如下所示。
在客户端,我有一个自定义 MessageBodyReader
,如下所示。问题是 Unmarshaller
总是返回一个空的 TreeSet
。
MovieSetMessageBodyReader.java
:
@SuppressWarnings("unchecked")
@Override
public TreeSet<Movie> readFrom(Class<TreeSet<Movie>> type,
Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
Class<Movie> baseType = Types.getCollectionBaseType(type, genericType);
try {
JAXBContext ctx = JAXBContext.newInstance(type, baseType);
JAXBElement<?> element = ctx.createUnmarshaller().unmarshal(
new StreamSource(entityStream), type);
return (TreeSet<Movie>) element.getValue();
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
MovieServiceRestEasyClient.java
:
@GET
@Consumes("text/xml")
public SortedSet<Movie> sendRequestByProxy() {
Map<String, Object> requestAttributes = new HashMap<String, Object>();
requestAttributes.put("path", path);
MovieServiceRestEasy proxy = ProxyFactory.create(
MovieServiceRestEasy.class, ENDPOINT, requestAttributes);
ClientResponse<TreeSet<Movie>> response = (ClientResponse<TreeSet<Movie>>) proxy
.getMovieSet(path);
return response.getEntity(TreeSet.class, (new GenericType<TreeSet<Movie>>() {}).getGenericType());
}
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<collection>
<movie>
<genre>Unknown</genre>
<name>4.3.2.1</name>
<year>2010</year>
</movie>
<movie>
<genre>Unknown</genre>
<name>Battlestar Galactica The Plan</name>
<year>2009</year>
</movie>
</collection>
I have a RESTful service client. The service returns SortedSet<Movie>
, where Movie
is a JAXB annotated class. The resulting XML is given below.
On the client side, I have a custom MessageBodyReader
as given below. The issue is that the Unmarshaller
always returns an empty TreeSet
.
MovieSetMessageBodyReader.java
:
@SuppressWarnings("unchecked")
@Override
public TreeSet<Movie> readFrom(Class<TreeSet<Movie>> type,
Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
Class<Movie> baseType = Types.getCollectionBaseType(type, genericType);
try {
JAXBContext ctx = JAXBContext.newInstance(type, baseType);
JAXBElement<?> element = ctx.createUnmarshaller().unmarshal(
new StreamSource(entityStream), type);
return (TreeSet<Movie>) element.getValue();
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
MovieServiceRestEasyClient.java
:
@GET
@Consumes("text/xml")
public SortedSet<Movie> sendRequestByProxy() {
Map<String, Object> requestAttributes = new HashMap<String, Object>();
requestAttributes.put("path", path);
MovieServiceRestEasy proxy = ProxyFactory.create(
MovieServiceRestEasy.class, ENDPOINT, requestAttributes);
ClientResponse<TreeSet<Movie>> response = (ClientResponse<TreeSet<Movie>>) proxy
.getMovieSet(path);
return response.getEntity(TreeSet.class, (new GenericType<TreeSet<Movie>>() {}).getGenericType());
}
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<collection>
<movie>
<genre>Unknown</genre>
<name>4.3.2.1</name>
<year>2010</year>
</movie>
<movie>
<genre>Unknown</genre>
<name>Battlestar Galactica The Plan</name>
<year>2009</year>
</movie>
</collection>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为什么不使用 POJO 来保存未编组/编组的值?例如:
Why don't you use POJO for holding the unmarshalled / marshalled values ? for example: