Java Spring:RESTful API的基本CRUD控制器的高效设计

时间:2015-12-16 02:38:55

标签: java spring rest crud

所以,假设我有一个简单的实体定义如下:

@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语句是最有效的选择。

1 个答案:

答案 0 :(得分:0)

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

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

使用它已经消除了if(fieldOne != null && !fieldOne.isEmpty())并调用直接包装字段的toUpdate.setFieldOne(...)。使用defaultValue自动设置false所需,并在您的网址中缺少请求参数时,将默认值插入到您的输入参数中。