jsonview注解RequestBody 拦截
Posted fly_bk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}
以上是关于jsonview注解RequestBody 拦截的主要内容,如果未能解决你的问题,请参考以下文章