【问题标题】:Java Spring: Efficient design of basic CRUD controller for RESTful APIJava Spring:RESTful API 基本 CRUD 控制器的高效设计
【发布时间】:2015-12-16 02:38:54
【问题描述】:

假设我有一个这样定义的简单实体:

@Entity
public class Person implements Serializable {
    @Id
    @GeneratedValue
    private Long id;

    private String fieldOne;
    private String fieldTwo;
    //...
    private String fieldN;
}

让我们考虑一个用于处理更新 Person 的端点的简单控制器,但只更新传入的非空/空白字段:

@Controller
@RequestMapping(value = "/api/person")
public class PersonController {
    @Autowired
    PersonRepository personRepository;

    @RequestMapping(value = "/update", method = RequestMethod.PUT)
    public void updatePerson(@RequestParam("personId") Long personId, 
        @RequestParam("fieldOne") String fieldOne, 
        @RequestParam("fieldTwo") String fieldTwo, 
        //... 
        @RequestParam("fieldN") String fieldN) {
        Person toUpdate = personRepository.findOne(personId);

        if(fieldOne != null && !fieldOne.isEmpty())
            toUpdate.setFieldOne(fieldOne);
        if(fieldTwo != null && !fieldTwo.isEmpty())
            toUpdate.setFieldTwo(fieldTwo);
        //...
        if(fieldN != null && !fieldN.isEmpty())
            toUpdate.setFieldN(fieldN);

        personRepository.save(toUpdate);
    }
}

是否有更有效的方法来更新实体实例?我考虑过使用 DTO 和 @RequestBody 方法(即updatePerson(@Valid @RequestBody PersonDTO personDTO),但这或多或少是相同的事情。

我主要担心的是,无论我使用什么方法,我显然不想接收空/空字符串并将实体的某些字段设置为空白,但是我想尽可能高效地执行此操作(代码可读性/可移植性,当然还有运行时方面的效率),我不完全确定是否有数百个类似于我上面的 if 语句是最有效的选择。

【问题讨论】:

    标签: java spring rest crud


    【解决方案1】:

    @RequestParam 实际上还有另一个参数是defaultValue,你可以使用它,这样参数就不会永远为空&所以你可以减少对空值和空值的检查

    @RequestParam(value="field" , defaultValue="****")
    

    通过使用你已经消除了 if(fieldOne != null && !fieldOne.isEmpty()) 并调用 toUpdate.setFieldOne(...) 直接包装字段。使用 defaultValue 会自动将 required 设置为 false,并在 URL 中缺少请求参数时将 默认值 插入到输入参数中。

    【讨论】:

    • 你能澄清一下吗?我不确定这将如何消除对您提到的陈述的需求。
    • 考虑到 url 请求是 /update.mvc?personId=personId 是空的,但是假设 defaultValuedefaultValue=**** 一样被分配给 ****,所以 personId 总是有一个值是****,不能为空。所以你不需要通过if(personId != null && !personId.isEmpty())而是if(personId !='****')来检查它。
    • 这样真的更有效率吗?这是一种不同的方法,但它真的会更有效率吗?另一个问题是如何选择默认值?如果我想允许每个可能的字符串作为输入怎么办?如果我的某个字段是 int/double/float 怎么办?那么选择默认值就更难了,不是吗?
    • personId 的默认值是****,因此personRepository.findOne(..) 不会返回任何人的值,并且是否每个字段都需要通过personRepository.findOne(..) 进行检查,实际上还有另一种方法可以将参数设置为数组 public void updatePerson(@RequestParam(value="myParam") String[] myParams){ ... } 当您在 url 上传递多个参数时,这很有用 /update.mvc?field1=a&field2=b&field3 ,然后是您的 myParams[0] =a,myParams[1]=b,myParams[2]=c
    • 所以我仍然需要为每个字段使用 if 语句?如果实体有一堆字段,这是我主要关心的问题之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2011-01-20
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多