关于swagger配置及踩坑@Api参数postion无效解决接口排序问题

目录
  • 添加maven依赖
  • 添加配置类
  • 在application.properties中添加配置
  • 添加控制类UserController
  • 请求对象类DTO
  • 响应对象类
  • 最后,上效果图
  • 最后还有个坑

添加maven依赖

<!-- 集成swagger2 -->
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger2</artifactId>
	<version>2.9.2</version>
</dependency>
<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-swagger-ui</artifactId>
	<version>2.9.2</version>
</dependency>
<!--google很好用的一个类库-->
<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>27.0.1-jre</version>
</dependency>

添加配置类

package top.lidaoyuan.hamster.api.config.swagger;
import java.util.Arrays;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;

import io.swagger.annotations.ApiOperation;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2Config {

	@Bean
	public Docket customDocket() {

		// 配置全局参数返回状态
		java.util.List<ResponseMessage> resMsgList = Arrays.asList(
				new ResponseMessageBuilder().code(200).message("成功!").build(),
				new ResponseMessageBuilder().code(-1).message("失败!").build(),
				new ResponseMessageBuilder().code(401).message("参数校验错误!").build(),
				new ResponseMessageBuilder().code(403).message("没有权限操作,请后台添加相应权限!").build(),
				new ResponseMessageBuilder().code(500).message("服务器内部异常,请稍后重试!").build(),
				new ResponseMessageBuilder().code(501).message("请登录!").build());

		return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
				.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
				.paths(PathSelectors.any())
				.build()
				.globalResponseMessage(RequestMethod.GET, resMsgList)
				.globalResponseMessage(RequestMethod.POST, resMsgList)
				.globalResponseMessage(RequestMethod.PUT, resMsgList)
				.globalResponseMessage(RequestMethod.DELETE, resMsgList);
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("Hamster接口文档")
				.description("接口文档说明")
				.version("1.0.0")
				.build();
	}
}

在application.properties中添加配置

logging.level.io.swagger.models.parameters.AbstractSerializableParameter=ERROR

添加控制类UserController

package top.lidaoyuan.hamster.api.web;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import top.lidaoyuan.hamster.api.dto.JsonResultDTO;
import top.lidaoyuan.hamster.api.dto.PageInputDTO;

import top.lidaoyuan.hamster.api.dto.UserInputDTO;
import top.lidaoyuan.hamster.api.entity.User;
import top.lidaoyuan.hamster.api.service.IUserService;

/**
 * 用户  前端控制器
 * @author Lidy
 * @since 2019-03-06
 */
@Api(tags = {"用户接口"})
@RestController
@RequestMapping("/v1/user")
@Slf4j
public class UserController {

	@Autowired
	private IUserService userService;

	@ApiOperation(value = "新增用户")
	@PostMapping
	public JsonResultDTO create(@RequestBody @Valid UserInputDTO inputDTO, BindingResult bindingResult) {
		log.info("create.inputDTO:" + inputDTO);

		boolean hasError = bindingResult.hasErrors();
		log.info("hasError:" + hasError);
		if(hasError) {
			List<String> errMsgList = bindingResult.getAllErrors().stream()
					.map(ObjectError::getDefaultMessage)
					.collect(Collectors.toList());
			return JsonResultDTO.errorArgument(errMsgList.toString());
		}

		User userDb = userService.save(inputDTO.convertToEntity());

		log.info("create.userDb:" + userDb );
		return JsonResultDTO.ok(inputDTO.convertFor(userDb));
	}

	@ApiOperation(value = "获取单个用户")
	@GetMapping("{id}")
	public JsonResultDTO getOne(@ApiParam(value = "用户Id", example = "1", required = true)
		@PathVariable Integer id) throws Exception {

		log.info("getOne.id:" + id);
		User userDb = userService.getOne(id);

		log.info("getOne.userDB:" + userDb);
		return JsonResultDTO.ok(new UserInputDTO().convertFor(userDb));
	}

	@ApiOperation(value = "更新单个用户")
	@PutMapping("{id}")
	public JsonResultDTO update(@ApiParam(value = "用户Id", example = "1", required = true)
			@PathVariable Integer id, @RequestBody UserInputDTO inputDTO) {
		log.info("update.id:" + id + " inputDTO:" + inputDTO );
		User userDb = userService.update(inputDTO.convertToEntity(), id);

		log.info("update.userDb:" + userDb );
		return JsonResultDTO.ok(inputDTO.convertFor(userDb));
	}

	@ApiOperation(value = "获取用户列表")
	@GetMapping("listExample")
	public JsonResultDTO listExample(UserInputDTO inputDTO) {
		log.info("listExample.inputDTO:" + inputDTO);
		List<User> listDb = null;
		if(inputDTO == null) {
			listDb = userService.list();
		}else {
			listDb = userService.list(inputDTO.convertToEntity());
		}

		log.info("listExample.listDb:" + listDb);
		if(listDb == null || listDb.size() ==0) return JsonResultDTO.ok();

		List<UserInputDTO> inputDTOList = new ArrayList<>();
		for(User user: listDb) {
			inputDTOList.add(inputDTO.convertFor(user));
		}

		return JsonResultDTO.ok(inputDTOList);
	}

	@ApiOperation(value = "分页获取用户列表")
	@GetMapping("listPageExample")
	public JsonResultDTO listPageExample(UserInputDTO inputDTO, PageInputDTO pageDTO) {
		log.info("listPageExample.inputDTO:" + inputDTO  + " pageDTO:" + pageDTO);
		Page<User> pageDb = null;
		if(inputDTO == null) {
			pageDb = userService.page(pageDTO);
		}else {
			pageDb = userService.page(inputDTO.convertToEntity(), pageDTO);
		}

		log.info("listPageExample.pageDb:" + pageDb);
		if(pageDb == null || pageDb.getSize() ==0) {
			return JsonResultDTO.ok();
		}

		List<UserInputDTO> inputDTOList = new ArrayList<>();
		for(User user: pageDb) {
			inputDTOList.add(inputDTO.convertFor(user));
		}

		return JsonResultDTO.page(inputDTOList,pageDb.getTotalElements());
	}

	@ApiOperation(value = "删除用户")
	@DeleteMapping("{id}")
	public JsonResultDTO deleteById(@ApiParam(value = "用户Id", example = "1", required = true)
		@PathVariable Integer id) {
		log.info("del.id:" + id);
		userService.deleteById(id);
		return JsonResultDTO.ok();
	}
}
 

请求对象类DTO

package top.lidaoyuan.hamster.api.dto;
import java.io.Serializable;
import com.google.common.base.Converter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import lombok.*;
import lombok.experimental.Accessors;

import javax.validation.constraints.*;

import top.lidaoyuan.hamster.api.entity.User;
import top.lidaoyuan.hamster.utils.BeanUtils;

import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;

/**
 *	用户DTO
 * @author Lidy
 * @since 2019-03-06
 */
@ApiModel(value = "用户Model")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ToString
@JsonInclude(Include.NON_NULL)
public class UserInputDTO implements Serializable {
	private static final long serialVersionUID = 1L;

	/** ID */
	@ApiModelProperty(hidden = true)
	private Integer id;

	/** 是否激活 */
	@ApiModelProperty(value = "是否激活", position = 1)
	private Boolean active;

	/** 年龄 */
	@ApiModelProperty(value = "年龄", position = 2)
	private Integer age;

	/** email */
	@ApiModelProperty(value = "email", position = 3)
	@Email(message = "邮箱格式不正确")
	@NotBlank(message = "【email】不能为空")
	@Size(max = 255, message = "【email】字段长度应<255")
	private String email;

	/** 姓 */
	@ApiModelProperty(value = "姓", position = 4)
	@NotBlank(message = "【姓】不能为空")
	@Size(max = 10, message = "【姓】字段长度应<10")
	private String firstname;

	/** 名 */
	@ApiModelProperty(value = "名", position = 5)
	@Size(max = 20, message = "【名】字段长度应<20")
	private String lastname;

	/** 开始时间 */
	@ApiModelProperty(value = "开始时间", example = "2019-03-06 17:09:10", position = 6)
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
	private Date startDate;

	/** 结束时间 */
	@ApiModelProperty(value = "结束时间", example = "2019-03-06 17:09:10", position = 7)
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
	private Date endDate;

	/** 转换成实体类 */
	public User convertToEntity() {
		return new UserInputDTOConver().convert(this);
	}

	/** 转换成InputDTO */
	public UserInputDTO convertFor(User bean) {
		return new UserInputDTOConver().reverse().convert(bean);
	}

	/** Conver转换类 */
	private static class UserInputDTOConver extends Converter<UserInputDTO, User> {
		@Override
		protected User doForward(UserInputDTO dto) {
			User bean = new User();
			BeanUtils.copyProperties(dto, bean);
			return bean;
		}

		@Override
		protected UserInputDTO doBackward(User bean) {
			UserInputDTO dto = new UserInputDTO();
			BeanUtils.copyProperties(bean, dto);
			return dto;
		}
	}
}
 

响应对象类

package top.lidaoyuan.hamster.api.dto;
import java.util.Arrays;
import java.util.List;
import org.springframework.data.domain.Page;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * 	Json结果DTO
 * @author ex-lidy001
 *
 */
@ApiModel(value = "返回JSON对象")
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(Include.NON_NULL)
public class JsonResultDTO {

	@ApiModelProperty(value = "状态码;200:成功")
	private Integer code;

	@ApiModelProperty(value = "状态说明")
	private String msg;

	@ApiModelProperty(value = "总记录数")
	private Long total;

	@ApiModelProperty(value = "返回数据")
	private Object data;
	public JsonResultDTO(Integer code, String msg) {
		this.code = code;
		this.msg = msg;
		this.data = Arrays.asList();
	}

	public JsonResultDTO(Integer code, String msg, Object data) {
		this.code = code;
		this.msg = msg;
		this.data = data;
		if(data == null) {
			this.data = Arrays.asList();
		}
	}	

	public static JsonResultDTO ok() {
		return new JsonResultDTO(200, "成功");
	}

	public static JsonResultDTO ok(String msg) {
		return new JsonResultDTO(200, msg);
	}

	public static JsonResultDTO ok(Object data) {
		return new JsonResultDTO(200, "成功", data);
	}

	public static JsonResultDTO page(Page<?> page) {
		JsonResultDTO jrDTO = new JsonResultDTO(200, "成功", page.getContent());
		jrDTO.setTotal(page.getTotalElements());
		return jrDTO;
	}

	public static JsonResultDTO page(List<?> list, Long total) {
		JsonResultDTO jrDTO = new JsonResultDTO(200, "成功", list);
		jrDTO.setTotal(total);
		return jrDTO;
	}

	public static JsonResultDTO error() {
		return new JsonResultDTO(-1, "失败!");
	}

	public static JsonResultDTO error(String msg) {
		return new JsonResultDTO(-1, msg);
	}

	public static JsonResultDTO errorArgument(String msg) {
		return new JsonResultDTO(401, "参数校验:" + msg);
	}

	public static JsonResultDTO unAuth() {
		return new JsonResultDTO(403, "没有权限!");
	}

	public static JsonResultDTO unlogin() {
		return new JsonResultDTO(501, "请登录!");
	}

	public static JsonResultDTO exception(String msg) {
		return new JsonResultDTO(500, "系统内部错误:" + msg);
	}
}
 

最后,上效果图

请求路径http://localhost:8080/swagger-ui.html

请求

响应

最后还有个坑

在使用最新版的springfox-swagger2 2.9.2``position排序的时候没有生效,后来在网上找了相关资料,需要重写swagger的两个类,具体如下。

package top.lidaoyuan.hamster.api.config.swagger;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.context.annotation.Primary;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import io.swagger.models.parameters.Parameter;
import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2MapperImpl;

/**
 * Created by wujie on 2019/2/16.
 * 重写 将Document转换成Swagger 类, 根据order进行排序
 */
@Primary //同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下
@Component("ServiceModelToSwagger2Mapper")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomModelToSwaggerMapper extends ServiceModelToSwagger2MapperImpl {

    @Override
    protected List<Parameter> parameterListToParameterList(List<springfox.documentation.service.Parameter> list) {
        //list需要根据order|postion排序
        list = list.stream().sorted((p1, p2) -> Integer.compare(p1.getOrder(), p2.getOrder())).collect(Collectors.toList());
//        log.debug("************************************list:{}", list.toString());
        return super.parameterListToParameterList(list);
    }
}
package top.lidaoyuan.hamster.api.config.swagger;
import static springfox.documentation.swagger.common.SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER;
import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;

import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiParam;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.service.AllowableListValues;
import springfox.documentation.service.AllowableValues;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.EnumTypeDeterminer;
import springfox.documentation.spi.service.ExpandedParameterBuilderPlugin;
import springfox.documentation.spi.service.contexts.ParameterExpansionContext;
import springfox.documentation.spring.web.DescriptionResolver;
import springfox.documentation.swagger.common.SwaggerPluginSupport;
import springfox.documentation.swagger.readers.parameter.Examples;
import springfox.documentation.swagger.schema.ApiModelProperties;

/**
 * Created by wujie on 2019/2/16.
 * 自定义ExpandedParameterBuilderPlugin,主要是修正源码query传入请求参数postion无效
 * 这里,将postion赋值给order
 */
@Primary
@Component
public class CustomSwaggerParameterBuilder implements ExpandedParameterBuilderPlugin {

    private final DescriptionResolver descriptions;
    private final EnumTypeDeterminer enumTypeDeterminer;

    @Autowired
    public CustomSwaggerParameterBuilder(
            DescriptionResolver descriptions,
            EnumTypeDeterminer enumTypeDeterminer) {
        this.descriptions = descriptions;
        this.enumTypeDeterminer = enumTypeDeterminer;
    }

    @Override
    public void apply(ParameterExpansionContext context) {
        Optional<ApiModelProperty> apiModelPropertyOptional = context.findAnnotation(ApiModelProperty.class);
        if (apiModelPropertyOptional.isPresent()) {
            fromApiModelProperty(context, apiModelPropertyOptional.get());
        }
        Optional<ApiParam> apiParamOptional = context.findAnnotation(ApiParam.class);
        if (apiParamOptional.isPresent()) {
            fromApiParam(context, apiParamOptional.get());
        }
    }

    @Override
    public boolean supports(DocumentationType delimiter) {
        return SwaggerPluginSupport.pluginDoesApply(delimiter);
    }

    private void fromApiParam(ParameterExpansionContext context, ApiParam apiParam) {
        String allowableProperty = Strings.emptyToNull(apiParam.allowableValues());
        AllowableValues allowable = allowableValues(
        		Optional.fromNullable(allowableProperty),
                context.getFieldType().getErasedType());

        maybeSetParameterName(context, apiParam.name())
                .description(descriptions.resolve(apiParam.value()))
                .defaultValue(apiParam.defaultValue())
                .required(apiParam.required())
                .allowMultiple(apiParam.allowMultiple())
                .allowableValues(allowable)
                .parameterAccess(apiParam.access())
                .hidden(apiParam.hidden())
                .scalarExample(apiParam.example())
                .complexExamples(Examples.examples(apiParam.examples()))
                .order(SWAGGER_PLUGIN_ORDER)
                .build();
    }

    private void fromApiModelProperty(ParameterExpansionContext context, ApiModelProperty apiModelProperty) {
        String allowableProperty = Strings.emptyToNull(apiModelProperty.allowableValues());
        AllowableValues allowable = allowableValues(
        		Optional.fromNullable(allowableProperty),
                context.getFieldType().getErasedType());

        maybeSetParameterName(context, apiModelProperty.name())
                .description(descriptions.resolve(apiModelProperty.value()))
                .required(apiModelProperty.required())
                .allowableValues(allowable)
                .parameterAccess(apiModelProperty.access())
                .hidden(apiModelProperty.hidden())
                .scalarExample(apiModelProperty.example())
                .order(apiModelProperty.position()) //源码这里是: SWAGGER_PLUGIN_ORDER,需要修正
                .build();
    }

    private ParameterBuilder maybeSetParameterName(ParameterExpansionContext context, String parameterName) {
        if (!Strings.isNullOrEmpty(parameterName)) {
            context.getParameterBuilder().name(parameterName);
        }
        return context.getParameterBuilder();
    }

    private AllowableValues allowableValues(final Optional<String> optionalAllowable, Class<?> fieldType) {

        AllowableValues allowable = null;
        if (enumTypeDeterminer.isEnum(fieldType)) {
            allowable = new AllowableListValues(getEnumValues(fieldType), "LIST");
        } else if (optionalAllowable.isPresent()) {
            allowable = ApiModelProperties.allowableValueFromString(optionalAllowable.get());
        }
        return allowable;
    }

    private List<String> getEnumValues(final Class<?> subject) {
        return Lists.transform(Arrays.asList(subject.getEnumConstants()), new Function<Object, String>() {
            @Override
            public String apply(final Object input) {
                return input.toString();
            }
        });
    }
}
 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 如何使用RequestHeaders添加自定义参数

    目录 RequestHeaders添加自定义参数 问题一 原因 解决方案 修改request中header的值 RequestHeaders添加自定义参数 在开发过程中有的时候,参数需要绑定到requestHeaders中,而并不是在body中进行传输.这个时候就需要我们自己定义参数(需要后台的配合) setToken() { let token = localStorage.getItem('token') ? localStorage.getItem('token') : '' this.i

  • java swagger ui 添加header请求头参数的方法

    我用到的swagger 主要有三款产品,swagger editor,swagger ui 和swagger codegen. swagger editor:主要是一个本地客户端,用来自己添加api,自己来测试,相当于一个api的可视化测试工具和定义工具吧. swagger ui:主要用户嵌入到项目中,将所有的接口生成一个可视化的页面,方便前后端联调 swagger codegen:主要用于通过swagger来自动生成代码 我用的swagger ui主要在java项目中.将所有的http接口提供

  • 关于swagger配置及踩坑@Api参数postion无效解决接口排序问题

    目录 添加maven依赖 添加配置类 在application.properties中添加配置 添加控制类UserController 请求对象类DTO 响应对象类 最后,上效果图 最后还有个坑 添加maven依赖 <!-- 集成swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> &l

  • SpringMVC配置404踩坑记录

    目录 前言 错误 原因 总结和教训 前言 在学习SpringMVC的路上真是开门就遇见拦路虎了,在配置的时候一直是按照硅谷的视频配置的.但是跑起来就一直是404,这个就很搞人心态了.在配置环境时是在晚上11:00然后配置到11:30,而找错误就十分的痛苦了,从当天晚上的12.00一直到半夜1.30还没找出来,第二天又是卡了一天,直到快到第三天的前一个小时可算让我找出来了. 首先在这里先感谢夜星大佬和杨总.夜星大佬远程帮我找错误,杨总帮我提意见!在此90°的鞠躬.同时也希望本篇博客能够帮助更多的小

  • Vant Weapp组件踩坑:picker的初始赋值解决

    在使用vant的picker组件时,我希望有在页面加载时向数据库获取值来设置picker的默认值.开始我使用官方文档中的default-index属性,并在onLoad方法中进行this.setData().但是这样做picker的默认索引还是0. 于是我又将setData放入onShow().onReady()方法,均不奏效.(我真的不知道为什么,新建一个空白页面测试也是这样) 继而我查看官方文档,发现picker有实例方法setIndexes(),于是尝试. 然而我在onLoad().onR

  • Nacos配置中心搭建及动态刷新配置及踩坑记录

    目录 一.Nacos配置中心介绍 二.配置中心搭建 1.配置中心启用 2.创建配置文件 3.工程配置 三.试验结果 四.踩坑经历 五.总结 近期有用到阿里的开源配置中心及注册中心nacos,特此记录并分享一些学习笔记及配置踩坑点. 一.Nacos配置中心介绍 从架构图上可以知道,Nacos提供了两种服务,一种是用于服务注册.发现的Naming Service,一种是用于配置中心.动态配置的Config Service,而他们底层均由core模块来支持. 外层提供OpenAPI供客户端使用,并提供

  • vue实力踩坑 当前页push当前页无效的解决

    目录 vue当前页push当前页无效 vue push报错 TypeError: Cannot read property ‘push‘ of undefined 解决方法 vue当前页push当前页无效 当在当前页面中push页面跳转当前页,只是push的参数不同时,只能用字符串拼接,parames和query都不会起作用.不知道为什么... 比如说:当前页的url是 /invest/myinvest?page=1&day=0-30` 但是想点击的时候改变参数,所以就 this.$router

  • springboot整合freemarker的踩坑及解决

    目录 springboot整合freemarker踩坑 报错 问题原因 解决方法 springboot freemarker基础配置及使用 1.基础配置 2.基础使用 springboot整合freemarker踩坑 报错 2021-04-23 02:01:18.148 ERROR 9484 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatc

  • 详解nginx basic auth配置踩坑记

    nginx的basic auth配置由ngx_http_auth_basic_module模块提供,对HTTP Basic Authentication协议进行了支持,用户可通过该配置设置用户名和密码对web站点进行简单的访问控制. basic auth配置示例: location / { auth_basic "closed site"; auth_basic_user_file conf/htpasswd; } 说明: auth_basic可设置为off或其它字符串,为off时表示

  • 解决springCache配置中踩的坑

    目录 springCache配置中踩的坑 先附上正确的配置 springCache配置及一些问题的解决 配置 @Cacheable参数 @CacheEvict 参数 @CachePut 参数 springCache配置中踩的坑 项目基于SpringBoot,使用了SpringCache. 早先在网上找了一份SpringCache的配置,后来由于需要使用到自定义序列化方法,注入一个自定义的序列化类.但是在后来发现自定义的序列化类始终没有调用,后来查看源码后终于发现了原因 先附上正确的配置 @Bea

  • vue3不能使用history.pushState修改url参数踩坑

    目录 前言 问题 追根溯源 解决 前言 在重构我的 vue-use-sync-url(辅助将数据和 url 参数进行同步的工具库)时,遇到了一个使用 window.history.pushState 来修改地址栏的 url 参数的 bug,准确来说是 vue-router 的 bug,下面就来讲讲具体是怎么回事. 问题 场景如下,有一个输入框里面输入了内容,点击搜索按钮使用 window.history.pushState 将数据同步到 url 参数上.然后再点击 go about 按钮跳转到别

  • ReactNative踩坑之配置调试端口的解决方法

    本文介绍了ReactNative踩坑之配置调试端口的解决方法,分享大家,顺便也给自己留个笔记 问题是这样的,由于公司的机器安装了安全软件,http://localhost:8081被占用了.(windows上配置环境真不易,最后一步还是被公司环境坑了) 所以导致按照教程配置完环境最后到真机上还是刷不出来界面 那么我们就这么放弃了吗?当然不,不然就白忙活了 分析问题:端口被占用,那我们换一个端口不就行啦,于是乎各种查阅资料,发现PackageManager(包管理服务)在启动的时候是可以配置端口的

随机推荐