zoukankan      html  css  js  c++  java
  • jsonview注解、RequestBody 、拦截

    @JsonView使用

    • 使用接口来声明多个视图
    • 在值对象的get方法上指定视图
    • 在Controller方法上指定视图
    public interface UserDetailView extends UserSimpleView {
    }
    
    public interface UserSimpleView {}
    
    public class User {
        private String username;
        private String password;
        private int age;
    
        public User() {
        }
    
        public User(String username, String password, int age) {
            this.username = username;
            this.password = password;
            this.age = age;
        }
        @JsonView(UserSimpleView.class)
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
        @JsonView(UserDetailView.class)
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
    }
    
    @RestController
    @SpringBootApplication
    public class UserController {
        @JsonView(UserDetailView.class)
        @GetMapping("/userdetail")
        public User userDetail(){
           return new User("tom","123",22);
        }
    
        @JsonView(UserSimpleView.class)
        @GetMapping("/user")
        public User user(){
            return new User("tom","123",22);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(UserController.class);
        }
    }
    

    测试

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = UserController.class)
    public class UserTest {
        @Autowired
        private WebApplicationContext wac;
        private MockMvc mockMvc;
        @Before
        public void setUp(){
            mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        }
        @Test
        public void test() throws Exception {
           String res =  mockMvc.perform(get("/userdetail")
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(status().isOk())
                    .andReturn().getResponse().getContentAsString();
            System.out.println(res);
        }
        @Test
        public void test2() throws Exception {
            String res =  mockMvc.perform(get("/user")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(status().isOk())
                    .andReturn().getResponse().getContentAsString();
            System.out.println(res);
        }
    }
    

    @RequestBody 映射请求体到java方法的参数

        @PostMapping
        public void create(@RequestBody User user){
            System.out.println(user.toString());
        }
    
      @Test
        public void test3() throws Exception {
            String user = "{"username":"tom","password":"null"}";
            mockMvc.perform(post("/user").contentType(MediaType.APPLICATION_JSON_UTF8).content(user))
                    .andExpect(status().isOk());
        }
    

    @Valid注解和BindingResult验证请求参数的合法性并处理校验结果

    参考import javax.validation.constraints

    public class User {
        private String username;
        @NotNull(message = "密码不能为空")
        private String password;
    
        @PostMapping
        public void create(@Valid @RequestBody User user, BindingResult errors){
            if (errors.hasErrors()){
                errors.getAllErrors().forEach(e->{
                    FieldError fieldError = (FieldError) e;
                    String msg = fieldError.getField() + " " + fieldError.getDefaultMessage();
                    System.out.println(msg);
                });
            }else {
                System.out.println(user.toString());
            }
        }
    

    拦截

    • 过滤器Filter

      使用@Component

      @Component
      public class TimeFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("TimeFilter init");
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("TimeFilter start");
              long start = new Date().getTime();
              filterChain.doFilter(servletRequest, servletResponse);
              System.out.println("耗时:"+(new Date().getTime()-start));
              System.out.println("TimeFilter end");
          }
      
          @Override
          public void destroy() {
              System.out.println("TimeFilter destroy");
          }
      }
      
      

      不使用@Component

      @Configuration
      public class WebConfig {
          @Bean
          public FilterRegistrationBean timeFilter(){
              FilterRegistrationBean registrationBean = new FilterRegistrationBean();
              TimeFilter timeFilter = new TimeFilter();
              registrationBean.setFilter(timeFilter);
              List<String> urls = new ArrayList<>();
              urls.add("/*");//所有请求
              registrationBean.setUrlPatterns(urls);
              return registrationBean;
      
          }
      }
      
    • 拦截器Interceptor

      会拦截所有请求,包括spring本身的处理

      可以拿到方法但没法拿到参数值

      @Component
      public class TimeInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("TimeInterceptor preHandle");
              request.setAttribute("time",new Date().getTime());
              HandlerMethod handlerMethod = (HandlerMethod)handler;
              System.out.println(handlerMethod.getBean().getClass().getName());
              System.out.println(handlerMethod.getMethod().getName());
              return true;
          }
      
          //成功后执行
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("TimeInterceptor postHandle");
              System.out.println("耗时:"+(new Date().getTime()-(Long) request.getAttribute("time")));
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              System.out.println("TimeInterceptor afterCompletion");
              System.out.println("耗时:"+(new Date().getTime()-(Long) request.getAttribute("time")));
              System.out.println("ex:"+ex);
          }
      }
      
      @Configuration
      public class WebConfig2 extends WebMvcConfigurationSupport {
          @SuppressWarnings("unused")
          @Autowired
          private TimeInterceptor interceptor;
          @Override
          protected void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(interceptor);
          }
      }
      
    • 切片Aspect

      @Aspect
      @Component
      public class TimeAspect {
          @Pointcut("execution(* com.app.controller..*(..))")
          private void controller(){}
          //在类名模式串中,“.”表示包下的所有类,而“..”表示包、子孙包下的所有类
          @Around("controller()")
          public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
              System.out.println("TimeAspect start");
              Object[] args = pjp.getArgs();
              for (Object arg : args) {
                  System.out.println(arg);
              }
              long start = new Date().getTime();
              Object proceed = pjp.proceed();
              System.out.println("耗时:"+(new Date().getTime()-start));
              System.out.println("TimeAspect end");
              return proceed;
          }
      }
      

    文件上传下载

      @PostMapping("/upload")
        public String fileUpload(MultipartFile file, HttpServletRequest request) throws Exception {
            try {
                String dir = request.getServletContext().getRealPath("/files");
                File fileDir = new File(dir);
                if (!fileDir.exists())
                    fileDir.mkdirs();
                System.out.println(file.getName());
                System.out.println(file.getOriginalFilename());
                System.out.println(file.getSize());
                String fileSuffix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
                File localFile = new File(fileDir, new Date().getTime() + fileSuffix);
                file.transferTo(localFile);
                return localFile.getAbsolutePath();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            return null;
        }
    
        @GetMapping("{id}")
        public void download(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) throws Exception {
            String dir = ResourceUtils.getURL("").getPath()+"springmvcDemo/src/main/webapp/files";
            System.out.println(dir);
            try (
                    InputStream inputStream = new FileInputStream(new File(dir, id + ".txt"));
                    OutputStream outputStream = response.getOutputStream()
            ) {
                response.setContentType("application/x-download");
                response.addHeader("Content-Disposition", "attachment;filename=test.txt");
    
                IOUtils.copy(inputStream, outputStream);
                outputStream.flush();
            }
        }
    
        @Test
        public void uploadSuccess() throws Exception {
            String result = mockMvc.perform(fileUpload("/upload")
                    .file(new MockMultipartFile("file", "test.txt", "multipart/form-data", "hello upload".getBytes(StandardCharsets.UTF_8))))
                    .andExpect(status().isOk())
                    .andReturn().getResponse().getContentAsString();
            System.out.println(result);
        }
    
  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/fly-book/p/12236069.html
Copyright © 2011-2022 走看看