Spring MVC的+ Hibernate的:从浏览器的部分模型更新(Spring MVC + H

2019-08-04 13:18发布

当只显示Spring MVC的模型bean的一部分,是有办法的模型只更新什么来自浏览器的后退?

比方说,我们有一个用户类(公共属性只有在这个例子中,当然):

public class User {
  public String firstName;
  public String lastName;
  public String email;
  public Date subscriptionExpiration;
}

现在我显示第一三个属性如在JSP输入域和要相应地更新在数据库中的对象。 只有这3个参数应更新,而不是第四个。 做到这将是一个办法

@RequestMapping("/user/{userId}", method=RequestMethod.POST)
public String saveChanges(@PathVariable userId, User user, Model model) {
  User oldUser = User.loadFromDB(userId);
  oldUser.firstName = user.firstName;
  oldUser.lastName = user.lastName;
  oldUser.email = user.email;
  oldUser.saveToDB();

  model.addAttribute("user", oldUser);
}

但是这将意味着硬编码可能会改变所有的属性,这是我不喜欢太多。

有没有什么办法来确定哪些字段基于什么用户被允许改变更新吗? 这种机制应该不仅仅是假设一切的请求中的参数可以改变的,否则任何精明的用户可以手动注入额外的字段到一个请求聪明。

使用@Entity(dynamicUpdate =真)不能解决问题,或者在我的眼前,因为我没有得到整个用户对象回到请求,这样做会带来许多安全漏洞。

我缺少在春天有个不错的功能,或者是有任何其他方式这个问题在概念解决? 任何提示是非常感谢!

Answer 1:

见这个问题知道如何使用@InitBinder允许/防止一些模型字段由Spring绑定到请求参数。 这允许在确认subscriptionExpiration不能通过注入一个请求参数进行修改。

而看到的文档了解如何使用的方法和方法的参数@ModelAttribute注解从数据库加载用户,并将其添加到模型被称为@RequestMapping方法之前,当填充该用户用请求参数@ RequestMapping方法被调用。 这使得从数据库获取用户和春天有从请求来临NE值来填充它。 所有你需要做的是验证用户的新状态,并将其保存到数据库中。



Answer 2:

我觉得方法

BeanUtils.copyProperties(Object source, Object target, String[] ignoreProperties) 

你想要做什么。 它复制从一个对象到另一所有属性不接触在定义的属性String[] ignoreProperties

给定源bean的属性值复制到指定的目标bean,忽视了给予“ignoreProperties”。

注:源和目标类没有匹配,甚至彼此得到的,只要属性相匹配。 在源bean公开,但目标bean的任何bean的属性不将默默地被忽略。

这仅仅是一个方便的方法。 对于更复杂的传输需求,可以考虑使用一个完整的BeanWrapper接口。

API文档



Answer 3:

你可以先读取数据库中的对象,然后绑定请求。 你可以找到一个例子FuWeSta-样品 。

它使用一个辅助性的bean必须由Spring初始化。



Answer 4:

一种选择是利用隐藏字段的表单。 与抽奖背上一个选项,但它工作在某些情况下,



Answer 5:

你正在寻找的很好的特性是@ModelAttribute 。 我假设你的表格也将发布的用户ID。

public class UserController {

    @ModelAttribute
    public User getUser(@RequestParam(value = "id", required = false) Long id) {
        return User.loadFromDB(id);
    }

    @RequestMapping("/user/{id}", method=RequestMethod.POST)
    public String saveChanges(@ModelAttribute User user, BindingResult bindingResult, Model model) {

        if (bindingResult.hasErrors()) {
            // return ...
        }

        //  model.asMap().clear();

        user.saveToDB();
        // return ...
    }
}


Answer 6:

我有同样的问题,最后只需添加类型转换器解决。

public class AbstractDocumentConverter implements Converter<String, AbstractDocument> {

    private AbstractDocumentRepository abstractDocumentRepository;

    public AbstractDocumentConverter(AbstractDocumentRepository abstractDocumentRepository) {
        this.abstractDocumentRepository = abstractDocumentRepository;
    }

    @Override
    public AbstractDocument convert(String id) {
        return abstractDocumentRepository.findOne(id);
    }
}

我使用MongoDB的,是AbstractDocument是所有我的文档超类,在控制器中我添加@ModelAttribute(“ID”)。

@RequestMapping("save")
public String save(@ModelAttribute("id") SportGame game) {
    sportGameService.save(game);
    return "redirect:/game/list";
}

它会先转换ID到模型(在我的转换器是一个找到从DB通过ID),然后填写从请求参数模型字段。



文章来源: Spring MVC + Hibernate: Partial model update from browser