我正处于开发新的Spring Boot应用程序的开始阶段,在其中我有实体,存储库和控制器。在某些情况下,我只想返回返回的JSON中对象的特定属性,因此我使用Jackson的mixin
来根据我的要求设置json属性。现在,在一个控制器(注释为@RestController
)中,我有一个返回String(即JSON)的方法,如下所示:
@RequestMapping(value = "/getbylang/{lang}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String getByQueryJsonIgnore(@PathVariable String lang) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(CountryDetail.class, CountryDetailMixIn.class);
return mapper.writeValueAsString(countryRepository.getCountriesByLanguageCode(lang));
}
在上面的代码中,countryRepository.getCountriesByLanguageCode
方法返回List<CountryDetail>
。我的问题是,是否有更好的性能或更清晰的方法,而不是在我想要处理mapper
或其他JSON相关行为的每个控制器方法中创建mixin
实例?是否有可能在不破坏功能的情况下创建全局静态ObjectMapper
(我对线程问题,Spring细微差别等不够了解)?或者,在方法中根据需要创建新ObjectMapper
的现有方法,性能影响是否可以忽略不计?
谢谢。
答案 0 :(得分:0)
正如评论所指出的那样,每次调用构建一个新的static
是非常昂贵的:可能需要比重复使用映射器多100倍的时间。
但是,请注意,您应该能够重用实例而无需使用Spring Boot本身使用的映射器。例如,您可以只创建该类的readValue()
成员:只要所有配置(包括定义混合)在首次调用writeValue()
或{{{{}}之前完成,映射器实例就是线程安全的。 1}}。
如果您确实需要针对不同端点使用不同的混合,则可能需要使用多个映射器实例,尽管每个端点可能不是一个(可能是某些共享混合设置,或者具有不重叠的设置)。这仍然比丢弃实例更有效,尽管会占用更多内存。