我试图通过jquery post请求向spring控制器发送自定义javascript对象(实际上,它的JSON对象数组)。 服务器端失败,“bla-bla没有匹配的编辑器或发现转换策略”错误。它无法从字符串转换为服务器端对象。 我找到了this和this示例,但我无法将其整合在一起以使其有效。 我应该覆盖哪些PropertyEditor方法? 有谁知道链接到任何例子? 谢谢。
控制器:
private class AddressFormEditor extends PropertyEditorSupport {
protected Object convertElement(Object element)
{
String form = "";
if (element instanceof String)
form = (String) element;
Logger logger = Logger.getLogger(getClass().getName());
logger.warning(form);
return form != null ? new AddressForm(form) : null;
}
}
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception
{
binder.registerCustomEditor(AddressForm.class, new AddressFormEditor());
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView saveUser(@ModelAttribute UserForm form, HttpServletResponse response) {...}
用户窗体:
public class UserForm extends BaseForm {
private Long id;
private String login;
private String password;
private String confirmPassword;
private String type;
private String franchise;
private String roles;
private String firstName;
private String lastName;
private String salutation;
private String position;
private String birthDate;
private String passportNumber;
private String passportIssueBy;
private String passportIssueDate;
private String passportExpireDate;
private String nationality;
private AddressForm[] addresses;
private String notes; ... }
jQuery请求:
var data = $('#userForm').serializeObject();
data.addresses = addresses;
$.ajax({
traditional: true,
type: 'POST',
url: url + 'save',
data: data,
success: function(response) {
if (response) {
initializeUser(response);
hideWait();
}
else {
showUsers();
$('#closeUserBtn').click();
}
},
error: function() {
error();
hideWait();
}
});
Logger写入地址为'[object Object]',但实际上有效数组已发送到服务器
答案 0 :(得分:3)
查看org.springframework.beans.propertyeditors
下的编辑器(在spring-beans jar中),其中包含spring提供的内置编辑器。
基本上,您需要覆盖setAsText()
和getAsText()
,这样您就可以从String 读取对象并将对象视为字符串分别。
CurrencyEditor
可以作为一个非常简单的例子。 CustomDateEditor
可能会稍微复杂一些。对于数组示例,请查看ClassArrayEditor
,例如。
然而,最好的方法是使用JSON映射技术而不是自己解析JSON;看看this post。