Spingfox在为swagger

时间:2015-11-16 04:58:25

标签: java json swagger jhipster springfox

我的jhipster v2.23.1应用程序使用自定义序列化程序和反序列化程序进行JSON解析,我在JacksonConfiguration中注册为模块。 REST API使用我的自定义映射按预期工作。

但是,自动生成的swagger文档中显示的JSON并不反映自定义映射。我希望swagger能够自动检测自定义序列化器/反序列化器,但由于它没有,我怎么能够大摇大摆地展示我的自定义JSON格式而不是它自己检测到的那个?

基于http://springfox.github.io/springfox/docs/current/#configuring-springfox的springfox文档,我实现了界面:

ApplicationListener<ObjectMapperConfigured> 

在我的SwaggerConfiguration bean中。我可以看到onApplicationEvent(ObjectMapperConfigured event)方法被调用两次。第一次映射器将按预期序列化我的对象,第二次它不会。如果我使用mapper注册我的模块,它似乎也没有什么区别。我在这里工作的对象是联系人。

@Override
public void onApplicationEvent(ObjectMapperConfigured event) {
    ObjectMapper mapper = event.getObjectMapper();

    // Custom serialization for Contact objects
    SimpleModule contactModule = new SimpleModule("Contact Module");
    contactModule.addSerializer(new ContactSerializer(Contact.class));
    contactModule.addDeserializer(Contact.class, new ContactDeserializer(Contact.class));

    mapper.registerModule(contactModule);

    // My custom object
    Contact c = new Contact();
    c.setCity("Springfield");
    c.setEmail("someone@gmail.com");

    String contactJsonStr = null;
    try {
        contactJsonStr = mapper.writeValueAsString(c);
    } catch(JsonProcessingException e) {
        e.printStackTrace();
    }
    System.out.println("Serialized Contact: " + contactJsonStr);
}

如何让springfox使用我的自定义序列化程序来构建我的swagger文档?或者我应该完全使用不同的方法吗?

1 个答案:

答案 0 :(得分:1)

嘿,我知道这是一个老问题,但我偶然发现同样的问题并做了一些研究。

解决方案非常简单。编写一个代表您的自定义序列化对象的类。然后只需使用Docket方法中的directModelSubstitute方法将原始模型类替换为序列化模型。

如果您的序列化程序执行类似的操作,将DateTime序列化为UNIX时间(长)

public void serialize(final DateTime value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException, JsonProcessingException {
        long millis = value.getMillis();
        gen.writeNumber(millis);
}

只需将此行.directModelSubstitute(DateTime.class, Long.class)添加到您的Docket定义中。