【问题标题】:@RequestParams for custom object types - parameter names@RequestParams 用于自定义对象类型 - 参数名称
【发布时间】:2017-01-28 01:27:02
【问题描述】:

我在 SpringBoot 中定义了一个 Spring Controller。 我想传入整个对象,而不是重复 MyCustomObject 的所有字段来节省一些输入。

@ResponseBody
@RequestMapping(value = "add", method = RequestMethod.POST)
public ResponseEntity<?> add(@ModelAttribute MyCustomObject myObj) { }

在测试请求方法时,我不确定各个请求参数名称是什么。我会虽然它会直接是字段名称。我的命名约定是将“m”作为前缀。

事实证明,Spring 决定通过反复试验设置的请求参数没有m,例如'鸡'而不是'mChicken'。我想知道是什么在控制它。也许它使用了 set/get 方法名称,只是去掉了那里的 get/set 前缀?

另外,我想知道以这种方式使用@ModelAttribute 是否正确。我不确定开发前端的人会在这里做什么,如果他们看我的弹簧控制器,或者其他发布 REST api 的东西。也许最好有单独的参数,而不是在那里有一个完整的@ModelAttribute。但是,它确实为我节省了一些尝试从各个参数以编程方式创建对象的精力。

@Entity
@Table(name = "my_stuff")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
public class MyCustomObject{

    private String mBeef;

    private String mChicken;


    public String getBeef() {} 
    public void setBeef(String beef);

    public String getChicken() {} 
    public void setChicken(String chicken);

}

Spring Boot 中有没有办法查看服务器上的 REST API(使用 gradlew bootRun 手动测试)。最好验证实际参数。

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

    您正在寻找的是 JavaBeans 约定,它着眼于您的类的公共 API。您的类具有名为beefchicken属性,对应的方法是get/set(或在布尔值的情况下为is)。

    JavaBeans 约定并不关心您如何存储属性——甚至完全有可能根本不存储属性(例如,isEmpty())。

    至于您的更大问题,@ModelAttribute(或@RequestBody)在输入是一些连贯的整体(例如表单)时使用。您可能有一个UserRegistrationForm,其中包含用户名、名字/姓氏、电子邮件地址、密码...当参数关系更松散时使用@RequestParam,例如搜索的各种参数。

    【讨论】:

    • 因此,如果您有一个表单并且正在添加一个具有多个参数的新对象,那么 @ModelAttribute 是有意义的,但是如果您正在搜索具有一些松散字段的东西,例如“按名称查找”,然后将它们作为单独的请求参数是有意义的。
    • @StealthRabbi 差不多。如果您熟悉的话,它与命令对象模式非常接近,而且我经常有 @ModelAttributes,它们实际上是在服务接口中定义的对象。
    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2021-05-24
    • 2010-12-31
    相关资源
    最近更新 更多