GlassFish 4 中EclipseLink MOXY实现REST应用简介(1)(2)
- <?xml version="1.0" encoding="UTF-8"?>
- <phone-number type="work">555-1234</phone-number>
如果不使用@XmlValue注解,则输出的XML为:
- <phone-numbertypephone-numbertype="work">
- <value>12345</value>
- </phone-number>
接下来,我们尝试调用这个服务。下面是调用的urlhttp://localhost:8080/CustomerResource/rest/customers/1,则返回的XML为:
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <customer id="1">
- <name>Jane Doe</name>
- <phoneNumbers>
- <phoneNumber type="work">5551111</phoneNumber>
- </phoneNumbers>
- </customer>
这个并不奇怪,因为对象是以JAXB的标准去注解的,可以通过REST返回XML。如果在GlassFish 3.1.2的时候,Moxy还不是默认的JSON Provider,有如下的几点值得注意:
- POJO中的id属性如果是int类型的会以JSON text类型返回
- customer对象中的phoneNumbers属性,其实持有的是List<PhoneNumber>,但在转变为JSON时变为JSON对象而不是一个JSON数组,如下:
- {
- "id": "1",
- "name": "Jane Doe",
- "phoneNumbers": {
- "phoneNumber": {
- "@type": "work",
- "$": "5551111"
- }
- }
- }
更奇怪的是,由于使用了@XmlAttribute注解和@XmlValue 注解,转变成JSON后,会分别变成“@type”,“$”显的不合理。而在最新的GlassFish 4中,上面的问题已经得到明显改善,输出的JSON如下:
- "id": 1,
- "name": "Jane Doe",
- "phoneNumbers": {
- "phoneNumber": [
- "@type": "work",
- "$": "5551111"
- ]
- }
- }
在GlassFish 4中,能够正确将POJO中的如int类型的正确序列化为JSON中的整形,即“id”:1,注意到PhoneNumber类中的value属性由于是String类型,因此在序列化为JSON后依然为String类型。但熟悉JSON的朋友应该清楚,phoneNumbers在这里依然没能转换为最标准的JSON格式,但我们可以使用JAX-RS中的ContextResolver机制,并使用MXOY中MOXyJsonConfig类去自定义JSON格式的显示,代码如下:
- package org.example.service;
- import javax.ws.rs.ext.*;
- import org.eclipse.persistence.jaxb.JAXBContextProperties;
- import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
- @Provider
- public class MOXyJsonContextResolver implements ContextResolver<MoxyJsonConfig> {
- private final MoxyJsonConfig config;
- public MOXyJsonContextResolver() {
- config = new MoxyJsonConfig()
- .setAttributePrefix("")
- .setValueWrapper("value")
- .property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
- }
- @Override
- public MoxyJsonConfig getContext(Class<?> objectType) {
- return config;
- }
- }
其中,通过MoxyJsonConfig类中的setValueWrapper方法,重新设置了使用原来POJO中的字段名作为JSON的key,因此就不带任何多余的符号了,生成的XML如下:
- {
- "id": 1,
- "name": "Jane Doe",
- "phoneNumbers": [
- {
- "type": "work",
- "value": "5551111"
- }
- ]
- }
可见,这是符合JSON格式标准的输出了。 读者可以进一步通过http://www.eclipse.org/eclipselink/moxy.php访问更多关于MOXY项目的情况,也可以关注http://blog.bdoughan.com/的博客以了解更多关于MXOY项目的用法。
用户点评