如何用 SpringBoot 優(yōu)雅的寫代碼

1. DTO的使用

如果你的controller代碼寫成這樣

    @RequestMapping("/user")
    public List query(@RequestParam String username,
                      @RequestParam String password,
                      @RequestParam int age){
        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        users.add(new User());
        return users;
    }

那你就需要了解一下什么是DTO了锋勺。

用DTO后的代碼

    @RequestMapping("/user")
    public List query(UserQueryCondition condition){

        System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.DEFAULT_STYLE));
        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        users.add(new User());
        return users;
    }

2. 如何使用PageAble設(shè)置默認(rèn)分頁屬性

你是不是還是在方法體里聲明Pageable對象固定屬性呢蚀瘸?
更優(yōu)雅的在這里:
@PageableDefault(page = 2,size = 7,sort = "username,asc")Pageable pageable

3. 如何再@RequestMapping注解上寫正則

@RequestMapping("/user/{id:\\d+}") id只能是數(shù)字

4. @JsonView注解自定義返回內(nèi)容

比如User類有兩個(gè)屬性,一個(gè)username一個(gè)password宙刘。
我們想在controller返回里苍姜,返回User實(shí)體的時(shí)候不返回password屬性。

4.1 設(shè)置視圖

首先需要在實(shí)體類里聲明兩個(gè)接口

    public interface UserSimpleView{};
    public interface UserDetailView extends UserSimpleView{};

然后悬包,在一定要顯示的字段的get方法上添加@JsonView(UserSimpleView.class)注解衙猪。
在不一定要顯示的字段的get方法上添加@JsonView(UserDetailView .class)注解。
User.java 完整代碼

public class User {

//    jsonView 設(shè)置視圖
    public interface UserSimpleView{};
    public interface UserDetailView extends UserSimpleView{};

    private String useranme;
    private String password;

    @JsonView(UserSimpleView.class)
    public String getUseranme() {
        return useranme;
    }

    public void setUseranme(String useranme) {
        this.useranme = useranme;
    }

    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

注意getUseranme方法上的注解和getPassword上注解的不同布近。

4.2 將實(shí)體類的get方法上的注解和Controller里相對應(yīng)

如果controller只想返回username字段垫释,則

    @RequestMapping("/user/{id:\\d+}")
    @JsonView(User.UserSimpleView.class)
    public User getInfo(@PathVariable int id){
        User user = new User();
        user.setUseranme("FantJ");
        return user;
    }

如果想返回全部的User屬性信息,則

    @RequestMapping("/user/{id:\\d+}")
    @JsonView(User.UserDetailView.class)
    public User getInfo(@PathVariable int id){
        User user = new User();
        user.setUseranme("FantJ");
        return user;
    }

上面這個(gè)controller方法撑瞧,我們看到@JsonView(User.UserDetailView.class)所以它會棵譬。如果變成返回全部的User屬性信息@JsonView(User.UserSimpleView.class),它就只返回username字段信息预伺。因?yàn)閁ser類和Controller類中@JsonView注解一一對應(yīng)订咸。

5. 判斷某個(gè)字段不為空

我們都知道曼尊,post方法,需要用@RequestBody接收實(shí)體類信息脏嚷。如果我們再方法里判斷某個(gè)屬性是否為空然后再拋錯(cuò)骆撇,必然增加代碼量,不美觀父叙。所以我們可以配合幾個(gè)注解來達(dá)到我們的要求神郊。

5.1 首先在實(shí)體類字段上添加注解@NotBlank
    @NotBlank  //不為空的注解
    private String password;
5.2 在Controller里的@RequestBody前加注解@Valid
@PostMapping("/user")
    public User create(@Valid @RequestBody User user){}

但是光這兩個(gè)注解作用下,如果密碼出現(xiàn)了空值趾唱,程序會直接報(bào)錯(cuò)涌乳,我們希望程序可以正常運(yùn)行,然后把報(bào)錯(cuò)信息打印出來就可以甜癞,于是我們還需要加一個(gè)類夕晓。BindingResult

5.3 添加BindingResult參數(shù)
    @PostMapping("/user")
    public User create(@Valid @RequestBody User user, BindingResult errors){}

那如何獲取錯(cuò)誤信息呢?看下面的完整代碼悠咱。

5.4 完整代碼
    @PostMapping("/user")
    public User create(@Valid @RequestBody User user, BindingResult errors){
        user.setId("1");
        //打印錯(cuò)誤信息
        if (errors.hasErrors()){
            errors.getAllErrors().stream().forEach(p-> System.out.println(p.getDefaultMessage()));
        }
        System.out.println(user.getId());
        System.out.println(user.getUseranme());
        System.out.println(user.getPassword());
        return user;
    }

但是你一看控制臺打印信息你會發(fā)現(xiàn)may not be empty运授,你都不知道是什么字段為空報(bào)錯(cuò)的,我們我們把字段信息打印出來乔煞。但是又顯得代碼很長吁朦。所以我們可以用@NotBlank的message屬性來自定義message。
除了@NotBlank外渡贾,還有一些類似常用的注解逗宜。

  • @NotNull 值不能為空
  • @NotEmpty 字符串不能為空,集合不能為空
  • @Range(min=,max=) 數(shù)字必須大于min小魚max
  • @Max(value=) 設(shè)置最大值同理還有 @Min(value=)
  • @Email 字符必須是Email類型
  • @Length(min= ,max= ) 字符串長度設(shè)置
  • @URL 字符串是url

6 自定義注解簡便開發(fā)

介紹下我的所有文集:

流行框架

SpringCloud
springboot
nginx
redis

底層實(shí)現(xiàn)原理:

Java NIO教程
Java reflection 反射詳解
Java并發(fā)學(xué)習(xí)筆錄
Java Servlet教程
jdbc組件詳解
Java NIO教程
Java語言/版本 研究

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空骚,一起剝皮案震驚了整個(gè)濱河市纺讲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囤屹,老刑警劉巖熬甚,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肋坚,居然都是意外死亡乡括,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門智厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诲泌,“玉大人,你說我怎么就攤上這事铣鹏》笊ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵诚卸,是天一觀的道長葵第。 經(jīng)常有香客問我绘迁,道長,這世上最難降的妖魔是什么卒密? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任脊髓,我火速辦了婚禮,結(jié)果婚禮上栅受,老公的妹妹穿的比我還像新娘。我一直安慰自己恭朗,他們只是感情好屏镊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痰腮,像睡著了一般而芥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膀值,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天棍丐,我揣著相機(jī)與錄音,去河邊找鬼沧踏。 笑死歌逢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翘狱。 我是一名探鬼主播秘案,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼潦匈!你這毒婦竟也來了阱高?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤茬缩,失蹤者是張志新(化名)和其女友劉穎赤惊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凰锡,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡未舟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掂为。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片处面。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菩掏,靈堂內(nèi)的尸體忽然破棺而出魂角,到底是詐尸還是另有隱情,我是刑警寧澤智绸,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布野揪,位于F島的核電站访忿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斯稳。R本人自食惡果不足惜海铆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挣惰。 院中可真熱鬧卧斟,春花似錦、人聲如沸憎茂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竖幔。三九已至板乙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拳氢,已是汗流浹背募逞。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馋评,地道東北人放接。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像留特,于是被迫代替她去往敵國和親透乾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容