2010-11-12 48 views
1

我正在做一个使用spring mvc框架的网站。 我想做一个调用ajax并直接从我的Web控制器接收一个json对象。 什么是最好的方式/方式/插件来做到这一点? 我已经看过keith donald的教程,但它看起来有些复杂。 感谢您的任何建议。从Web控制器获取json对象的最佳方式是什么?

我已将jakson json映射器放入我的pom文件中。 我的控制器看起来像:

@RequestMapping(value = "m015", method = RequestMethod.GET) 
public @ResponseBody String list(@RequestParam(value = "type", required = true) String type){ 
    List<Mail> mails = mailService.getUserMails((Long) WebHelper.getPrincipal().getUser().getId(),type); 
    logger.info("yeah"); 
    return mails.toString(); 
} 

,但我得到这个我的javascript:[email protected]]

我Ajax调用的样子:

var xhrArgs = { 
url: "${ctx}/portal/mail/m015.do", 
content: { type: id }, 
headers: {'Content-Type':'application/json'}, 
handleAs: 'text', 
sync: true, 
load: function(data) { 
    alert(data); 
}, 

}; dojo.xhrGet(xhrArgs);

请问我错过了什么?

+0

可以使用例如库如jQuery做AJAX调用简单。 – Javi 2010-11-14 16:12:49

回答

0
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="interceptors"> 
     <list> 
      <ref bean="localeChangeInterceptor" /> 
     </list> 
    </property> 
</bean> 

<!-- Enables annotated POJO @Controllers --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
     </list> 
    </property> 
</bean> 

1

春天3.0它是那样简单:

@RequestMapping("/ajax/foo") 
@ResponseBody 
public Foo foo(){ 
    return new Foo(); 
} 

请确保您有杰克逊JSON库在您的应用程序和春季会自动的序列化JSON作为结果。

0

博客中描述的方式其实非常简单和优雅。你可以重新使用控制器方法来获得JSON,XML等响应...

你所做的只是用@ResponseBody注释该方法,并在你的项目中包含一个JSON jar。我自己用的行家,并通过添加这种依赖性做到这一点:

<!-- Jackson JSON Mapper --> 
<dependency> 
<groupId>org.codehaus.jackson</groupId> 
<artifactId>jackson-mapper-asl</artifactId> 
<version>1.5.4</version> 
</dependency> 

在这样做的好处是那么控制器方法可以返回一个POJO(最好是一个DTO)和映射器将在映射到JSON,只要对服务器的请求具有正确的头文件,其中包含accept-encoding:application/json(或其它)。它甚至可以将正确的内容类型的传入请求转换为方法签名中的dto类型。美丽!方法的

例子:

@RequestMapping(value ="/service/status", method = RequestMethod.GET) 
public @ResponseBody Status getServiceStatus() { 

    return new Status("Online", 60, "Nothing to report"); 
} 

使用这种方法,你可以重用你的方法(我用这一个REST API)的JSON,Web服务等...

+0

我还有一个问题,我有更新我的问题,请看看。谢谢 – 2010-11-12 20:00:17

+0

跳过.toString()并返回类型列表。 – 2010-11-12 20:52:50

+0

当我这样做,我得到一个错误,导致控制器正试图返回视图m015不存在 – 2010-11-14 04:13:26

相关问题