Spring [boot] 使用技巧集合-不断积累

来源:互联网 发布:打开文件的软件 编辑:程序博客网 时间:2024/06/05 11:19

1、Spring  boot 如何允许跨域访问

测试中遇到的问题,需要前段跨域访问,使用过滤器设置

extends OncePerRequestFilter


@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "application/json");response.setHeader("Access-Control-Allow-Origin", "*");//允许所以域名访问,*需要换位制定来源,务必注意这里response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");//允许的访问方式    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type,auth_token");    response.setHeader("Access-Control-Request-Headers", "x-requested-with,content-type,Accept,自定义header");response.setHeader("Access-Control-Request-Method", "GET,POST,PUT,DELETE,OPTIONS");


filterChain.doFilter(request, response);}

2、Spring boot发布到tomcat

正常打包,war,启动,访问的时候需要项目的名字,需要注意的是,Spring boot 天然不支持tomcat 6了,虽然想点别的办法也可以,但是避免麻烦直接使用tomcat8吧


3、Spring boot 测试启动在项目外围

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

4、spring boot 结合 mybitas后如何打印sql语句

application.yml 文件中配置即可,但是这种模式打印日志会比较多,其实是可以制定打印日志的方法类的, ALT+/会提示,指定到 Mapper类所在包路径即可,#是注释掉

logging:  level:    #root: DEBUG    cn.test.dao: DEBUG    

5、spring boot 整合 mock


用于回滚
@Rollback(true)
extends AbstractTransactionalJUnit4SpringContextTests



maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- junit --><dependency>           <groupId>junit</groupId>           <artifactId>junit</artifactId>           <version>4.12</version>           <scope>test</scope></dependency>



spring boot 1.4 之前,在测试类上方

@RunWith(SpringJUnit4ClassRunner.class)  @SpringApplicationConfiguration(classes = TestApplication.class) //使用TestApplication作为spring容器加载类@ActiveProfiles("test")   //这边test指配置文件指向spring-test.yml@Rollback(false) //单元测试配置数据库默认会事务会退  此时强制事务提交


spring boot 1.4之后,在测试类上方

@RunWith(SpringRunner.class)@SpringBootTest@WebAppConfiguration @Rollback(false) //单元测试配置数据库默认会事务会退  此时强制事务提交

余下部分-从新包好了1.4后,类上方的配置

@RunWith(SpringRunner.class)@SpringBootTest@WebAppConfiguration @Rollback(false) //单元测试配置数据库默认会事务会退  此时强制事务提交public class NameControllerTest extends AbstractTransactionalJUnit4SpringContextTests{private MockMvc mockMvc;@Autowired protected WebApplicationContext wac;// 该方法在每个方法执行之前都会执行一遍@Beforepublic void setUp() throws Exception {//mockMvc = MockMvcBuilders.standaloneSetup(new NameController()).build();mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象}@Testpublic void testAddDeliverAddress() throws UnsupportedEncodingException, Exception {String responseString = mockMvc.perform(post("/path/") // 请求的url,请求的方法是post.contentType(MediaType.APPLICATION_JSON) // 数据的格式.param("a", "a") // 添加参数.param("phone", "15000000000") // 添加参数).andExpect(status().isOk()) // 返回的状态是200.andDo(print()) // 打印出请求和相应的内容.andReturn().getResponse().getContentAsString(); // 将相应的数据转换为字符串System.out.println("--------返回的json = " + responseString);}}




Spring MVC  MOCk:

http://www.cnblogs.com/lyy-2016/p/6122144.html

Maven

<dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-test</artifactId>              <version>${springframework.version}</version>          </dependency>


测试类

package com.bestcxx.stu.springmvc.controller;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.mock.web.MockHttpServletResponse;import org.springframework.test.annotation.DirtiesContext;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;import junit.framework.TestCase;@DirtiesContext@WebAppConfiguration//单元测试的时候真实的开启一个web服务  @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath:spring/springmvc-servlet.xml"})//@TransactionConfiguration(transactionManager = "defaultTransactionManager",defaultRollback=false)//事务管理  @Rollback(true)public class HomeControllerTest extends AbstractTransactionalJUnit4SpringContextTests{@Autowired    private WebApplicationContext wac;    private MockMvc mockMvc;    @Before    public void setup() {        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();   //构造MockMvc    }        @Test    public void testShouHomePage() throws Exception{     MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/home"))                   .andExpect(MockMvcResultMatchers.view().name("home"))                 .andExpect(MockMvcResultMatchers.status().is(MockHttpServletResponse.SC_OK))                 .andDo(MockMvcResultHandlers.print())                 .andReturn();                      TestCase.assertNotNull(result.getModelAndView().getModel().get("user"));      }}

  控制台打印结果:

MockHttpServletRequest:      HTTP Method = GET      Request URI = /home       Parameters = {}          Headers = {}Handler:             Type = com.bestcxx.stu.springmvc.controller.HomeController           Method = public java.lang.String com.bestcxx.stu.springmvc.controller.HomeController.shouHomePage(java.util.Map<java.lang.String, java.lang.String>)Async:    Async started = false     Async result = nullResolved Exception:             Type = nullModelAndView:        View name = home             View = null            Model = nullFlashMap:       Attributes = nullMockHttpServletResponse:           Status = 200    Error message = null          Headers = {}     Content type = null             Body =     Forwarded URL = /WEB-INF/views/home.jsp   Redirected URL = null          Cookies = [] INFO | Scheduler org.springframework.scheduling.quartz.SchedulerFactoryBean#0_$_NON_CLUSTERED paused. INFO | Scheduler org.springframework.scheduling.quartz.SchedulerFactoryBean#0_$_NON_CLUSTERED shutting down. INFO | Scheduler org.springframework.scheduling.quartz.SchedulerFactoryBean#0_$_NON_CLUSTERED paused. INFO | Scheduler org.springframework.scheduling.quartz.SchedulerFactoryBean#0_$_NON_CLUSTERED shutdown complete. INFO | {dataSource-1} closed

6、Spring 提供的 url-页面 的现成的方法-无需业务逻辑处理

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/** * 本类用于处理 不处理数据直接通过url 跳转到 页面的方法 * 默认访问 /login  指向 login.html 页面 * @author wj * */@Configurationpublic class WebMvcConfig extends WebMvcConfigurerAdapter{@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/login").setViewName("login");}}


7、Spring validate 检测实体

Maven 依赖

<!-- validation 校验 开始 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version></dependency><dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>2.2.4</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.4</version></dependency><!-- validation 校验 结束 -->    

Controller层

@ResponseBody@RequestMapping(value="/model",method={RequestMethod.GET,RequestMethod.POST})public HashMap<String,Object> model(@Valid @ModelAttribute("usermodel") UserModel usermodel,BindingResult bindingResult){System.out.println("有userName吗:"+usermodel.getUserName());HashMap<String,Object> map=new HashMap<String,Object>();if(bindingResult.hasErrors()){              List<ObjectError> ls=bindingResult.getAllErrors();              for (int i = 0; i < ls.size(); i++) {                System.out.println("error:"+ls.get(i));                map.put("result", "WRONG");                map.put("msg",ls.get(i).getDefaultMessage());                return map;            }          }map.put("result", "OK");return map;}

dto层-UserModel

字符串  @NotBlank 排除空字符串和“”

             @NotEmpty  允许空字符串,不允许为“”

整形     @NotNull   


public class UserModel implements Serializable{private static final long serialVersionUID = -2443619924488167195L;/**使用 notblank 是不允许空字符串的*/@Size(min=5,message="userName 长度不能小于5")@NotBlank(message="userName 不允许为空,或者空字符串")private String userName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}

测试类-mock

package com.bestcxx.stu.springmvc.controller;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.MediaType;import org.springframework.test.annotation.DirtiesContext;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;@DirtiesContext@RunWith(SpringRunner.class) //@RunWith(SpringJUnit4ClassRunner.class)  也是可以的@WebAppConfiguration   //单元测试的时候真实的开启一个web服务    @ContextConfiguration(locations={"classpath:spring/springmvc-servlet.xml"}) //@TransactionConfiguration(transactionManager = "defaultTransactionManager",defaultRollback=false)//事务管理    @Rollback(true)  public class ParameterControllerTest extends AbstractTransactionalJUnit4SpringContextTests{      @Autowired      private WebApplicationContext wac;      private MockMvc mockMvc;      @Before      public void setup() {          this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();   //构造MockMvc      }            @Test      public void testModel() throws Exception{           MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/parameterController/model") // 请求的url,请求的方法是post                   .contentType(MediaType.APPLICATION_JSON) // 数据的格式                   .param("name"," " ) // 增加参数         ).andExpect(MockMvcResultMatchers.status().isOk()) // 返回的状态是200                 .andDo(MockMvcResultHandlers.print()) // 打印出请求和相应的内容                   .andReturn(); // 将相应的数据转换为字符串           System.out.println("--------返回的json = " + mvcResult.getResponse().getContentAsString());      }  }  

如果是Spring Boot 测试,@SpringBootTest后面也是可以指定文件位置的,也可以默认不指定

@RunWith(SpringRunner.class)  @SpringBootTest  @WebAppConfiguration   @Rollback(true) //单元测试配置数据库默认会事务会退  此时强制事务提交  


8、Spring Boot 在eclipse 开发过程中自动构建

(1)增加maven依赖

 <!-- spring-boot热部署 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <optional>true</optional><!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖本项目的项目如果想要使用devtools,需要重新引入 -->        </dependency>

(2)eclipse中开启自动构建功能-会降低开发效率哦

Project-Build Automatically










原创粉丝点击