我正在努力将REST/JSON服务从Coldfusion 9转换为Spring-MVC 3.1应用程序.我使用的杰克逊(1.9.5)和MappingJacksonJsonConverter Spring提供,和我定制ObjectMapper与CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES名称字段.
我面临的问题是我们的遗留服务产生"带有下划线的UPPER案例的驼峰案例"作为json属性名称.这个JSON的消费者,也是用ColdFusion编写的,可能不关心案例,但Jackson确实关心案例,并抛出UnrecognizedPropertyExceptions.
寻找到几乎所有设置后,我可以从ObjectMapper达到 - DeserializationConfig,DeserializerProvider,等我结束了一个非常混乱的黑客中,我解析到一个JSON树,自定义JsonGenerator,较低的情况下,字段名,并将其输出然后将其作为对象解析回来.
MappingJacksonHttpMessageConverter mc = new MappingJacksonHttpMessageConverter() {
@Override
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return this.getObjectMapper().readValue(translateToLowerCaseKeys(inputMessage.getBody()), getJavaType(clazz));
}
private byte[] translateToLowerCaseKeys(InputStream messageBody) throws IOException {
StringWriter sw = new StringWriter();
JsonGenerator lowerCaseFieldNameGenerator = new JsonGeneratorDelegate(this.getObjectMapper().getJsonFactory().createJsonGenerator(sw)) {
@Override
public void writeFieldName(String name) throws IOException, org.codehaus.jackson.JsonGenerationException {
delegate.writeFieldName(name.toLowerCase());
};
};
this.getObjectMapper().writeTree(lowerCaseFieldNameGenerator, this.getObjectMapper().readTree(messageBody));
lowerCaseFieldNameGenerator.close();
return sw.getBuffer().toString().getBytes();
}
};
Run Code Online (Sandbox Code Playgroud)
这个解决方案似乎非常低效.有一个解决方案适用于地图的键,但我无法找到类似的字段名称解决方案.
另一种解决方案是拥有两个setter,一个用传统字段名称注释.命名策略必须扩展为忽略这些字段,在我的情况下这很好,因为对象映射器不会处理任何其他具有UPPER_UNDERSCORE策略的类:
public class JsonNamingTest {
public static class CaseInsensitive extends LowerCaseWithUnderscoresStrategy …Run Code Online (Sandbox Code Playgroud) 我们目前正在尝试使用Salesforce平台来替换几个内部CRM工具,并且已经部署了一些代码.随着我们的代码库的增长,我们开始感受到其他人在代码组织方面所描述的一些痛苦(没有好的命名空间/包装等).我们是企业级客户,虽然我们目前的实验目前只涉及一个部门,但我们希望它最终会成长为整个公司.
在一个拥有3-4个完全不同的销售团队的组织中,每个团队都有不同的业务流程,因此编码不同(在SF术语中:记录类型,布局,触发器等),管理部署的好方法是什么?"套餐"是否适合这种情况,或者整个公司是否应该在同一个SF Org /名称空间内运行良好?