我有过
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
SessionInfo register(UserProfile profileJson){
...
}
我通过这种方式传递profileJson:
http://server/url?profileJson={"email": "mymail@gmail.com"}
但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?
您可以创建自己的< code >转换器,并让Spring在适当的时候自动使用它:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
@Component
class JsonToUserProfileConverter implements Converter<String, UserProfile> {
private final ObjectMapper jsonMapper = new ObjectMapper();
public UserProfile convert(String source) {
return jsonMapper.readValue(source, UserProfile.class);
}
}
正如您在下面的控制器方法中看到的,不需要任何特殊的东西:
@GetMapping
@ResponseBody
public SessionInfo register(@RequestParam UserProfile userProfile) {
...
}
如果您使用组件扫描并使用@Component
注释转换器类,Spring会自动拾取转换器。
详细了解Spring MVC中的Spring Converter和类型转换。
这可以使用自定义编辑器来完成,该编辑器将JSON转换为UserProfile对象:
public class UserProfileEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
ObjectMapper mapper = new ObjectMapper();
UserProfile value = null;
try {
value = new UserProfile();
JsonNode root = mapper.readTree(text);
value.setEmail(root.path("email").asText());
} catch (IOException e) {
// handle error
}
setValue(value);
}
}
这是为了在控制器类中注册编辑器:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(UserProfile.class, new UserProfileEditor());
}
下面是如何使用编辑器来解组JSONP参数:
@RequestMapping(value = "/jsonp", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
@ResponseBody
SessionInfo register(@RequestParam("profileJson") UserProfile profileJson){
...
}
解决这个问题是如此简单明了,它实际上会让你发笑,但在我开始之前,让我首先强调一下,没有一个有自尊心的Java开发人员会这样做,我的意思是永远不要使用JSON而不使用Jackson高性能JSON库。
Jackson不仅是Java开发人员的工作狂和事实上的JSON库,而且它还提供了一整套API调用,使JSON与Java集成变得易如反掌(您可以在http://jackson.codehaus.org/下载Jackson)。
现在来看答案。假设您有一个如下所示的UserProfile pojo:
public class UserProfile {
private String email;
// etc...
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// more getters and setters...
}
...然后,您的Spring MVC方法将GET参数名称“profileJson”转换为JSON,JSON值为{“email”:“mymail@gmail.com”},在您的控制器中将如下所示:
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper; // this is your lifesaver right here
//.. your controller class, blah blah blah
@RequestMapping(value="/register", method = RequestMethod.GET)
public SessionInfo register(@RequestParam("profileJson") String profileJson)
throws JsonMappingException, JsonParseException, IOException {
// now simply convert your JSON string into your UserProfile POJO
// using Jackson's ObjectMapper.readValue() method, whose first
// parameter your JSON parameter as String, and the second
// parameter is the POJO class.
UserProfile profile =
new ObjectMapper().readValue(profileJson, UserProfile.class);
System.out.println(profile.getEmail());
// rest of your code goes here.
}
砰!你完了。我鼓励您浏览Jackson API的大部分内容,因为正如我所说,它是一个救星。例如,您是否从控制器返回JSON?如果是这样,您所需要做的就是在lib中包含JSON,并返回POJO,Jackson将自动将其转换为JSON。没有比这更容易的了。干杯!:-)
问题内容: 我有 我以这种方式传递profileJson: 但是我的profileJson对象具有所有空字段。我应该怎么做才能使spring解析我的json? 问题答案: 这可以通过自定义编辑器完成,该编辑器将JSON转换为UserProfile对象: 这是为了在控制器类中注册编辑器: 这是使用编辑器解组JSONP参数的方法:
我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦
我正在使用Spring形式。我只需要得到Staemap作为响应,但我得到的是整个jsp页面作为响应。
问题内容: 我正在阅读一本书,并在有关控制器的一章中谈到渲染的内容,对于JSON,它有一个类似这样的示例,但没有详细介绍,因此我无法弄清楚该示例所适合的整体情况: 还有使用JSONP和回调函数的示例: 有人可以解释这些吗? 问题答案: 通常,您将返回JSON的原因之一是: A)您正在将部分/全部应用程序构建为单页应用程序(SPA),并且需要客户端JavaScript能够提取其他数据而无需完全重新加
我正在寻找重定向与参数到一个控制器在Laravel和拿起参数在第二个控制器。 我是按照下面链接的文档在第一个控制器中设置的。 https://laravel.com/docs/5.3/redirects#redirecting-控制器动作 重定向 路线 第二控制器 但是,这当前返回未定义的变量。 这是最好的方法吗?如果是的话,我错在哪里?
我想使用@SessionAttributes注释在SpringMVC中的两个控制器之间共享会话属性。 下面是我用来测试属性共享的一个简单代码:AController。JAVA a.jsp BController.java b.jsp 我期望的行为是转到 /aURL,myParam将被设置为0到99之间的随机值,然后该值将在两个控制器之间共享。 但是,会发生以下情况:我转到/a URL,myPara