1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > spring boot 整合web开发之文件上传 静态资源访问 异常处理 返回JSON数据

spring boot 整合web开发之文件上传 静态资源访问 异常处理 返回JSON数据

时间:2022-07-08 04:40:44

相关推荐

spring boot 整合web开发之文件上传 静态资源访问 异常处理 返回JSON数据

目录

springboot 整合web开发返回json数据静态资源访问文件上传全局异常

1、返回json数据

springboot默认的是jackson-databind做为json处理器、也可以使用自定义转换器:gson、fastjson

gson集成方式为:在pom文件中排除jackson-databind jar包,添加gson包。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion></exclusions></dependency>

dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency>

springboot默认提供了Gson自动转换类GsonHttpMessageConvertersConfiguration,因此Gson依赖添加成功后,可以像使用json-databind那样使用Gson。但是如果想格式化日期等操作得需要自己自定义。

@Configurationpublic class GsonConfig {@BeanGsonHttpMessageConverter gsonHttpMessageConverter() {GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();GsonBuilder builder = new GsonBuilder();builder.setDateFormat("yyyy-MM-dd");builder.excludeFieldsWithModifiers(Modifier.PROTECTED);Gson gson = builder.create();gsonHttpMessageConverter.setGson(gson);return gsonHttpMessageConverter;}}

fastJson集成方式:在pom文件中排除jackson-databind jar包,添加fastjson

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.56</version></dependency

配置fastjson的HttpMessageConverter

@Configurationpublic class MyFastJsonConfig {@BeanFastJsonHttpMessageConverter fastJsonHttpMessageConverter() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setDateFormat("yyyy-MM-dd");config.setCharset(Charset.forName("UTF-8"));config.setSerializerFeatures(SerializerFeature.WriteClassName,SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullStringAsEmpty);converter.setFastJsonConfig(config);return converter;}}

对于FastJsonHttpMessageConverter的配置,还有另一种方式。实现WevMvcConfigurer接口(spring5.0之前继承WebMvcConfigurerAdapter类来实现)

@Configurationpublic class MyWebMvcConfig implements WebMvcConfigurer {//处理json@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setDateFormat("yyyy-MM-dd");config.setCharset(Charset.forName("UTF-8"));config.setSerializerFeatures(SerializerFeature.WriteClassName,SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullStringAsEmpty);converter.setFastJsonConfig(config);converters.add(converter);}//自定义静态资源位置@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");}}

2、静态资源访问

springboot默认会过滤所有的静态资源,默认静态资源5个位置(classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/、/),优先级依次降低。

自定义过滤策略:1)、可以在application.properties直接定义过滤规则

spring.mvc.static-path-pattern=/static/**

spring.resources.static-locations=classpath:/static

2)、java编码实现

@Configurationpublic class MyWebMvcConfig implements WebMvcConfigurer {//处理json@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setDateFormat("yyyy-MM-dd");config.setCharset(Charset.forName("UTF-8"));config.setSerializerFeatures(SerializerFeature.WriteClassName,SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullStringAsEmpty);converter.setFastJsonConfig(config);converters.add(converter);}//自定义静态资源位置@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");}}

3、文件上传

文件上传一共涉及两个组件,一个是CommonsMultipartResolver基于commons-fileupload来处理,另一个是StandardServletMultipartResolver基于serlver3.0multipart。springboot默认采用的是StandardServletMultipartResolver做为上传组件。

如果想使用CommonsMultipartResolver做为上传组件代码如下:

pom文件需要加入common jar包

<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>1.4</version>

</dependency>

<!-- /artifact/commons-fileupload/commons-fileupload -->

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.3.1</version>

</dependency>

@Configurationpublic class MyCommonsMultipartResolver {@Beanpublic CommonsMultipartResolver commonsMultipartResolver() {CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();commonsMultipartResolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常commonsMultipartResolver.setMaxUploadSize(1024);commonsMultipartResolver.setDefaultEncoding("UTF-8");return commonsMultipartResolver;}}

4、全局异常处理

关键字@ControllerAdvice

1)、返回resonse代码如下,上传文件大小超过限制就会输出到页面。

@ControllerAdvicepublic class CustomerExceptionHandler {@ExceptionHandler(MaxUploadSizeExceededException.class)public void uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp) throws IOException {resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.write("上传文件大小超限");out.flush();out.close();}}

2)、返回ModelAndView

@ControllerAdvicepublic class CustomerExceptionHtmlHandler {@ExceptionHandler(MaxUploadSizeExceededException.class)public ModelAndView uploadException(MaxUploadSizeExceededException e) throws IOException {ModelAndView view = new ModelAndView();view.addObject("msg","上传文件超限");view.setViewName("/error");return view;}}

@ControllerAdvice还可以配置全局参数,具体代码如下

@ControllerAdvicepublic class GlobalConfig {@ModelAttribute(value = "info")public Map<String,String> userInfo() {Map<String,String> map = new HashMap<>();map.put("usename","路遥");map.put("gender","男");return map;}}

@RestControllerpublic class GlobalController {@GetMapping("/global")public void globalParma(Model model) {Map<String, Object> map = model.asMap();Set<String> strings = map.keySet();Iterator<String> iterator = strings.iterator();while (iterator.hasNext()) {String next = iterator.next();Object o = map.get(next);System.out.println(next + ">>>>>>" + o);}}}

以上所有代码都在:/FadeHub/spring-boot-learn下面的spring-boot-web工程下

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。