我在SpringMVC应用程序中使用MappingJacksonJsonView来从我的控制器渲染JSON.我希望我的对象中的ObjectId呈现为.toString,而是将ObjectId序列化为其部分.它在我的Velocity / JSP页面中运行得很好:Velocity:$thing.i...

我在SpringMVC应用程序中使用MappingJacksonJsonView来从我的控制器渲染JSON.我希望我的对象中的ObjectId呈现为.toString,而是将ObjectId序列化为其部分.它在我的Velocity / JSP页面中运行得很好:
Velocity:
$thing.id
Produces:
4f1d77bb3a13870ff0783c25
Json:
<script type="text/javascript">
$.ajax({
type: 'GET',
url: '/things/show/4f1d77bb3a13870ff0783c25',
dataType: 'json',
success : function(data) {
alert(data);
}
});
</script>
Produces:
thing: {id:{time:1327331259000, new:false, machine:974358287, timeSecond:1327331259, inc:-260555739},…}
id: {time:1327331259000, new:false, machine:974358287, timeSecond:1327331259, inc:-260555739}
inc: -260555739
machine: 974358287
new: false
time: 1327331259000
timeSecond: 1327331259
name: "Stack Overflow"
XML:
<script type="text/javascript">
$.ajax({
type: 'GET',
url: '/things/show/4f1d77bb3a13870ff0783c25',
dataType: 'xml',
success : function(data) {
alert(data);
}
});
</script>
Produces:
<com.place.model.Thing>
<id>
<__time>1327331259</__time>
<__machine>974358287</__machine>
<__inc>-260555739</__inc>
<__new>false</__new>
</id>
<name>Stack Overflow</name>
</com.place.model.Thing>
有没有办法阻止MappingJacksonJsonView从ObjectId中获取那么多信息?我只想要.toString()方法,而不是所有细节.
谢谢.
添加Spring配置:
@Configuration
@EnableWebMvc
public class MyConfiguration {
@Bean(name = "viewResolver")
public ContentNegotiatingViewResolver viewResolver() {
ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver();
contentNegotiatingViewResolver.setOrder(1);
contentNegotiatingViewResolver.setFavorPathExtension(true);
contentNegotiatingViewResolver.setFavorParameter(true);
contentNegotiatingViewResolver.setIgnoreAcceptHeader(false);
Map<String, String> mediaTypes = new HashMap<String, String>();
mediaTypes.put("json", "application/x-json");
mediaTypes.put("json", "text/json");
mediaTypes.put("json", "text/x-json");
mediaTypes.put("json", "application/json");
mediaTypes.put("xml", "text/xml");
mediaTypes.put("xml", "application/xml");
contentNegotiatingViewResolver.setMediaTypes(mediaTypes);
List<View> defaultViews = new ArrayList<View>();
defaultViews.add(xmlView());
defaultViews.add(jsonView());
contentNegotiatingViewResolver.setDefaultViews(defaultViews);
return contentNegotiatingViewResolver;
}
@Bean(name = "xStreamMarshaller")
public XStreamMarshaller xStreamMarshaller() {
return new XStreamMarshaller();
}
@Bean(name = "xmlView")
public MarshallingView xmlView() {
MarshallingView marshallingView = new MarshallingView(xStreamMarshaller());
marshallingView.setContentType("application/xml");
return marshallingView;
}
@Bean(name = "jsonView")
public MappingJacksonJsonView jsonView() {
MappingJacksonJsonView mappingJacksonJsonView = new MappingJacksonJsonView();
mappingJacksonJsonView.setContentType("application/json");
return mappingJacksonJsonView;
}
}
而我的控制器:
@Controller
@RequestMapping(value = { "/things" })
public class ThingController {
@Autowired
private ThingRepository thingRepository;
@RequestMapping(value = { "/show/{thingId}" }, method = RequestMethod.GET)
public String show(@PathVariable ObjectId thingId, Model model) {
model.addAttribute("thing", thingRepository.findOne(thingId));
return "things/show";
}
}
解决方法:
我不得不让getId()方法返回一个String.这是让杰克逊停止序列化ObjectId的唯一方法.
public String getId() {
if (id != null) {
return id.toString();
} else {
return null;
}
}
public void setId(ObjectId id) {
this.id = id;
}
setId()仍然必须是ObjectId,因此Mongo(及其驱动程序)可以正确设置ID.
本文标题为:java spring MappingJacksonJsonView在mongodb ObjectId上没有做toString


基础教程推荐
- SpringBoot整合RabbitMQ实战教程附死信交换机 2022-12-27
- 解决java连接虚拟机Hbase无反应的问题 2023-01-09
- Dubbo本地调试的几种方式总结 2023-07-01
- 从0开始教你开发一个springboot应用 2022-11-23
- 基于Hutool的图片验证码功能模块实现 2023-06-17
- JSP实时显示当前系统时间的四种方式示例解析 2023-07-30
- 详解eclipse项目中的.classpath文件原理 2023-08-11
- SpringBoot自定义Starter实现流程详解 2023-06-01
- Log4j如何屏蔽某个类的日志打印 2023-08-10
- Mapreduce分布式并行编程 2023-03-31