温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot 中如何使用@ControllerAdvice

发布时间:2021-08-06 14:50:00 来源:亿速云 阅读:254 作者:Leah 栏目:编程语言

SpringBoot 中如何使用@ControllerAdvice,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

@ControllerAdvice 是一种作用于控制层的切面通知(Advice),该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型,并应用到所有控制器上。

SpringBoot 中如何使用@ControllerAdvice

@ModelAttribute 添加全局数据

一、设置全局数据

先准备一个实体类对象。

public class User {

    private String username;

    private Integer age;
}

编写设置全局数据配置。 

import com.example.demo.model.Demo;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;

/**
 * @author piao
 * @date 2021-04-20
 */
@ControllerAdvice
public class DemoConfig {

    /************************************  方法一 ***************************************/

    @ModelAttribute(value = "demo")
    public String demoStr() {
        return "this is demo";
    }

    @ModelAttribute(value = "demo")
    public Demo demoObj() {
        return new Demo().setUsername("piao").setPassword("123");
    }

    /************************************  方法二 ***************************************/

    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "this is demo");

        Demo demo = new Demo().setUsername("piao").setPassword("123");
        model.addAttribute("demo", demo);
    }

}

二、获取全局数据 

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/1")
    public String hello(@ModelAttribute("msg") String msg, @ModelAttribute("demo") Demo demo) {
        return "msg:">

三、验证结果

SpringBoot 中如何使用@ControllerAdvice

@InitBinder 请求参数预处理

结合 @InitBinder 还能实现请求参数预处理,即将表单中的数据绑定到实体类上时进行一些额外处理。

一、请求问题

1、编写两个实体类,用来接收参数

@Data
@Accessors(chain = true)
public class Demo {

    private String username;

    private String password;

}

@Data
@Accessors(chain = true)
public class User {

    private String username;

    private Integer age;
}

2、编写 Controller 请求接口

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping()
    public String demo(Demo demo, User user) {
        return "demo username:" + demo.getUsername() + " | user username:" + user.getUsername();
    }
}

3、请求测试,抛出问题

SpringBoot 中如何使用@ControllerAdvice

我们传递了两个username值,希望被demo和user对象分别接收,最终却被两个对象一起接收并拼接了。

二、编写解放方法

1、使用 @InitBinder 即可解决上面的问题,这里我们创建一个全局的参数预处理配置

@ControllerAdvice
public class DemoConfig {

    @InitBinder("user")
    public void init1(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("user.");
    }

    @InitBinder("demo")
    public void init2(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("demo.");
    }

}

在 WebDataBinder 对象中,除了可以设置前缀,还可以设置允许、禁止的字段、必填字段以及验证器等等。

2、编写 Controller 代码

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping()
    public String demo(@ModelAttribute("demo") Demo demo, @ModelAttribute("user") User user) {
        return "demo username:" + demo.getUsername() + " <br/> user username:" + user.getUsername();
    }

}

三、验证结果

SpringBoot 中如何使用@ControllerAdvice

关于SpringBoot 中如何使用@ControllerAdvice问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI