【问题标题】:How to bind String[] to Collection of POJOs?如何将 String[] 绑定到 POJO 集合?
【发布时间】:2014-05-02 07:54:44
【问题描述】:

我有一个获得一串权限的活页夹,并且必须将其转换为集合。但是当 binder 方法被调用时,它不能将 String 数组转换为集合。

我的控制器:

@Controller
@RequestMapping("/profile")
public class ProfileController {
    @Autowired
    @Qualifier("mvcUserService")
    UserService userService;

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editForm(Principal principal) {
        User user = userService.getUser(principal.getName());
        ModelAndView mav = new ModelAndView("user/profile");
        return mav.addObject("user", user);
    }

    @RequestMapping(value = "/edit", method = RequestMethod.PUT)
    public ModelAndView edit(@ModelAttribute("user") User user, BindingResult result) {
        // some action with User object
    }

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Permission.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String name) throws IllegalArgumentException {
                Permission permission = userService.getPermission(name);
                setValue(permission);
            }
        });

JSP:

<form:form action="/profile/edit" method="PUT" modelAttribute="user">
<input type="hidden" name="_method" value="PUT"/>

// setting up fields

<form:hidden path="id"/>
<form:hidden path="permissions"/>
</form:form>

权限类:

public class Permission implements Serializable {
    private Integer id;
    private String name;

还有我的用户类:

public class User implements Serializable {

    // some fields

    private Collection<Permission> permissions;

我需要实现正确的绑定。有什么建议我该怎么做?

【问题讨论】:

  • 它是否调用了绑定?还是抛出错误?
  • 它正在调用绑定。
  • 那么什么不起作用?从您的示例中,您似乎没有发送 String[] 或任何东西。
  • 在我的活页夹中,我以单个字符串“edit_user,delete_user”的形式获得权限。但我的活页夹无法将其转换为 Collection.
  • 我的理解是 Spring MVC 已经知道如何处理 collecitons 部分,而不是 bean 部分。你是说它不是那样工作的吗?

标签: java jsp spring-mvc


【解决方案1】:

您的编辑器似乎缺乏将 CSV 列表转换为对象列表的逻辑。这是 PermissionListEditor 的代码,它将以逗号分隔的字符串列表与 List 集合相互转换:

public class PermissionListEditor extends PropertyEditorSupport {

  @Override
  public void setAsText(String text) throws IllegalArgumentException {
    List<Permission> res = new ArrayList();
    for (String v: text.split(",")) {
      if (v.trim().length() > 0)
        res.add(userService.getPermission(v.trim()));
    }
    setValue(res);
  }

  @Override
  public String getAsText() {
    StringBuilder val = new StringBuilder();
    for (Permission p: (List<Permission>) getValue()) {
      if (val.length() > 0) val.append(", ");
      val.append(p.getName());
    }
    return val.toString();
  }

}

添加某种映射来查找 Permission 对象而不是从数据库中一个一个地获取它们可能是一个好主意。在构造函数中是这样的:

Map<String, Permission> map = new HashMap()<>;
for (Permission p: userService.listPermissions();
  map.add(p.getName(), p);

然后在 setAsText() 方法中从该地图中检索对象:

res.add(map.get(v.trim());

希望有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2011-02-22
    • 2011-08-04
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多