Restlet Complex Object to XML serializaton

我有restlet web服务,它返回响应为xml。 我用jackson作为活页夹。 下面是我要回来的class级。

import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class ApiResponse implements Serializable { /** * */ private static final long serialVersionUID = -2736991050157565598L; private int responseCode; private String reponseMessage; private List body = new ArrayList(); public int getResponseCode() { return responseCode; } public void setResponseCode(int responseCode) { this.responseCode = responseCode; } public String getReponseMessage() { return reponseMessage; } public void setReponseMessage(String reponseMessage) { this.reponseMessage = reponseMessage; } public List getBody() { return body; } public void setBody(List body) { this.body = body; } } 

以下是服务的回复。 除了将嵌套对象的属性名称与父对象相同之外,一切都很好。 它显示了嵌套标签名称的正文,但我希望它是T模板。 有任何想法吗?

  1    1 name1   2 name2    

这是Jackson的默认序列化。 但是,您可以利用自定义序列化程序来改进这一点 此function允许您将jackson生成的内容放在特定课程中。 您可以使用自己的策略覆盖默认策略,并以非常精细的方式配置将要创建的策略。

下面是为SomeBean类生成内容的实体示例:

 public class SomeBeanSerializer extends JsonSerializer { @Override public void serialize(SomeBean bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); // Fields jgen.writeNumberField("id", bean.getId()); (...) // Link String href = (...) HypermediaLink linkToSelf = new HypermediaLink(); linkToSelf.setHref(href + bean.getId()); linkToSelf.setRel("self"); jgen.writeObjectField("hypermediaLink", linkToSelf); jgen.writeEndObject(); } } 

以下是在Restlet中配置它的方法:

 JacksonConverter jacksonConverter = getRegisteredJacksonConverter(); if (jacksonConverter != null) { ObjectMapper objectMapper = jacksonConverter.getObjectMapper(); SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null)); module.addSerializer(SomeBean.class, new SomeBeanSerializer()); objectMapper.registerModule(module); } 

此链接可以帮助您了解如何配置Restlet的Jackson转换器: https : //templth.wordpress.com/2015/02/23/optimizing-restlet-server-applications/ 。 它提供了方法getRegisteredJacksonConverter的内容。

编辑 :使用Restlet的2.3版本,在这个级别上有所改变。 对象映射器现在由JacksonRepresentation而不是JacksonConverter本身带来。 现在,对于每种这种表示,实例化对象映射器。 这意味着您需要对这两个元素进行子类化以配置自定义序列化程序。

以下是CustomJacksonRepresentation类的代码:

 public class CustomJacksonRepresentation extends JacksonRepresentation { @Override public ObjectMapper getObjectMapper() { if (this.objectMapper == null) { this.objectMapper = createObjectMapper(); SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null)); module.addSerializer(SomeBean.class, new SomeBeanSerializer()); objectMapper.registerModule(module); } return this.objectMapper; } } 

以下是CustomJacksonConverter类的代码:

 public class CustomJacksonConverter extends JacksonConverter { protected  JacksonRepresentation create( MediaType mediaType, T source) { return new CustomJacksonRepresentation( mediaType, source); } protected  JacksonRepresentation create( Representation source, Class objectClass) { return new CustomJacksonRepresentation( source, objectClass); } } 

实现后,您需要更换由Restlet自动注册的现有jackson转换器。 这是执行此操作的代码:

 // Looking for the registered jackson converter JacksonConverter jacksonConverter = null; List converters = Engine.getInstance().getRegisteredConverters(); for (ConverterHelper converterHelper : converters) { if (converterHelper instanceof JacksonConverter) { jacksonConverter = (JacksonConverter) converterHelper; break; } } // converters Engine.getInstance().getRegisteredConverters().remove( jacksonConverter); CustomJacksonConverter customJacksonConverter = new CustomJacksonConverter(); Engine.getInstance().getRegisteredConverters().add( customJacksonConverter); 

您可以注意到,在Restlet的第3版中将重构管理转换器的方法,以使配置更方便! 😉

希望它对你有帮助,蒂埃里