我正在使用Spring和javascript。用XhrHttpRequest
对象调用@Controller
。
我可以看到我的参数(JSON字符串)与Chrome检查器,但当我调用request.getParamter("id")
返回null。
Calling part with js
function ajax(url, data, callback, method){
//data is {"id":"system", "password" : "1234"}
var httpRequest;
var afterAction = function(){
if(!httpRequest) {
console.error('can not find httpRequest variable');
return;
}
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
var responseData = httpRequest.responseText;
//alert(JSON.stringify(responseData));
console.log('Result of API call >>>', responseData);
if(typeof callback == 'function') {
callback(JSON.parse(responseData));
}
} else {
alert('There was a problem with the request.');
}
}
}
//=========== LOGIC ============
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 6 and older
httpRequest = new ActiveXObject('Microsoft.XMLHTTP');
}
if(!method) method = 'POST';
data = (!!data) ? JSON.stringify(data) : '';
httpRequest.onreadystatechange = afterAction;
httpRequest.open(method.toUpperCase(), url, true);
httpRequest.setRequestHeader("Content-type", "application/json; charset=utf-8");
//httpRequest.setRequestHeader("Content-length", data.length);
//httpRequest.setRequestHeader("Connection", "close");
httpRequest.send(data);
}
接收部分与弹簧@Controller
@Controller
@RequestMapping(value={"member"}, produces={"application/json"})
@ResponseStatus(value = HttpStatus.OK)
public class MemberController {
/**
* @param request
* @param resp
* @return
* @throws Exception
*/
@RequestMapping(value={"/login"})
public @ResponseBody String login(HttpServletRequest request, HttpServletResponse resp) throws Exception {
System.out.println("Login request");
String id = String.valueOf(request.getParameter("id")); //returns null
String password = String.valueOf(request.getParameter("password")); //returns null
Map<String, String> result = new HashMap<String, String>();
result.put("result", "S");
result.put("message", "login success");
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(result);
}
}
我不知道为什么参数变成null。谢谢。
您需要按照以下步骤接受控制器中的Json
:
public class UserLogin {
private String id;
private String password;
//Add getters and setters
}
(2)改变你的控制器接受Json &接收UserLogin bean
@Controller
@RequestMapping(value={"member"}, produces={"application/json"})
@ResponseStatus(value = HttpStatus.OK)
public class MemberController {
@RequestMapping(value={"/login"}, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String login(UserLogin userLogin) throws Exception {
System.out.println("Login request");
String id = userLogin.getId();
String password = userLogin.getPassword();
Map<String, String> result = new HashMap<String, String>();
result.put("result", "S");
result.put("message", "login success");
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(result);
}
}
这是Jackson Library的另一种方式。我喜欢@javaguy的方式,但使用Jackson库可能更灵活,所以添加这个帖子。
准备-
WebMvcConfigurerAdapter
实现类或与 相当的东西 - SpringFramework环境。在我的例子中,
Eclipse Dynamic Web Project
与Maven
和spring-webmvc
在pom.xml
中。
我所做的……
- 实施
WebMvcConfigurerAdapter
- 覆盖方法
configureMessageConverters
- 将控制器参数从
HttpServeletRequest request, HttpServletResponse resp
更改为@RequestBody Map<?, ?>
(可更改通用值)。后续处理不重要)
这里是代码
ServerConfig.java(我阻止其他选项来关注当前问题)
@Configuration
@EnableWebMvc
@ComponentScan(basePackages={ ... }
, excludeFilters=@ComponentScan.Filter(Configuration.class))
//Filter 걸 때 Configuration.class 를 수동으로 등록해줘야 되는데 나은 방법 찾아보기
public class ServerConfig extends WebMvcConfigurerAdapter {
...
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
super.configureMessageConverters(converters);
}
};
和Controller (Change Parameter Types)
@Controller
@RequestMapping(value={"member"}, produces={"application/json"})
@ResponseStatus(value = HttpStatus.OK)
public class MemberApiController {
...
@RequestMapping(value={"/login"})
public @ResponseBody String login(@RequestBody Map<?, ?> jsonBody) throws JsonProcessingException {
System.out.println("Login request" + jsonBody.toString());
Map<String, String> result = new HashMap<String, String>();
String rs = "S";
String message = "SUCCESS";
System.out.println("ID >>> ", String.valueOf(jsonBody.get("id")));
System.out.println("PW >>> ", String.valueOf(jsonBody.get("password")));
result.put("result", rs);
result.put("result_msg", message);
mapper = new ObjectMapper();
return mapper.writeValueAsString(result);
}
};
然而,因为据我所知@RequestBody
没有HttpSession
,如果你试图将数据存储到HttpSession
,你需要另一个参数HttpServletRequest
。
我希望这能帮助到那些和我有同样问题的人。