使用IDEA快速搭建Springboot項目(Springboot+JPA)(統一異常處理+HTTP請求日誌處理)

1.使用IDEA新建一個項目,選擇左側的spring Initializr,選擇好jdk版本之後點擊下一步

2.然後idea會自動創建一個maven項目。之後點擊下一步

3.選擇項目所需要的依賴,如web,jpa,mysql等等

 4.最後一步:給項目命名,選擇項目地址,就創建完成了。

項目的啓動入口

springboot項目創建完成會自動創建一個項目入口,直接運行就可以了,當然,項目中什麼都沒有訪問的話會報404錯誤。

使用JPA完成對數據庫的CRUD

1.首先將項目默認的application.properties文件改爲:application.yml文件(官方推薦)

jpa的配置:ddl-auto:create會是項目自動在數據庫中創建對應的表

2.首先創建一個pojo包,並創建一個javabean。

package com.tellhow.demo.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.persistence.*;
import javax.validation.constraints.Min;

@Component//加入spring容器中
@Entity     //映射數據庫中的表
@ConfigurationProperties(prefix = "user")//配置屬性bean,會將yml文件中的前綴爲user的屬性值映射到此bean中用來直接使用
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    private String username;

    @Min(value =12,message = "年齡不能小於12歲")//表單驗證
    private int age;

    private String cupSize;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCupSize() {
        return cupSize;
    }

    public void setCupSize(String cupSize) {
        this.cupSize = cupSize;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", cupSize='" + cupSize + '\'' +
                '}';
    }
}

此時啓動項目,springboot就能根據yml裏的配置,和javabean上的@Entity註解,在數據庫中創建一張對應的表。

3.編寫repository接口,(即平常的Dao接口),繼承JPA的JPARepository接口。(裏面封裝了一些對數據庫的基本操作,類似於mybatis的通用mapper)

package com.tellhow.demo.repository;

import com.tellhow.demo.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User,Integer>{

}

4.編寫控制層(增刪改查rest接口)。

package com.tellhow.demo.controller;

import com.tellhow.demo.pojo.User;
import com.tellhow.demo.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/say")
public class UserController {
    private static Logger logger= LoggerFactory.getLogger(UserController.class);
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private User user;

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public Object sayHello(){
        return user;
    }

    /**
     * 查詢所有
     * @return
     */
    @GetMapping("/users")
    public List<User> getUsers(){
        return userRepository.findAll();
    }

    /**
     * 新增
     * @param user
     * @return
     */
    @PostMapping("/user")
    public Object saveUser(@Valid User user, BindingResult result){
        if (result.hasErrors()){
            logger.info(result.getFieldError().getField(),result.getFieldError().getDefaultMessage());
            return result.getFieldError().getDefaultMessage();
        }
        return userRepository.save(user);
    }

    /**
     * 修改
     * @param user
     * @return
     */
    @PutMapping("/user")
    public User updateUser(User user){
        return userRepository.save(user);
    }

    /**
     * 刪除
     * @param user
     */
    @DeleteMapping("/user")
    public void deleteUser(User user){
        userRepository.delete(user);
    }
}

項目統一異常處理

新建一個ExceptionHandle,使用@ControllerAdvice註解標識。

@ControllerAdvie是spring3.2之後出現的,常用來配合@ExceptionHandle做異常處理

package com.tellhow.demo.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 統一異常處理
 *
 */
@ControllerAdvice//控制器增強,
                // 配合@ExceptionHandler使用,
                // 如果不用@ControllerAdvice,
                // 則ExceptionHandler只能在當前出異常的controller裏使用,
                // 使用controllerAdvice則可以接觸這個限制,
public class ExceptionHandle {

    /**
     * 此方法會對項目拋出的異常統一捕獲,然後將異常信息返回給客戶端
     * @param e
     * @return
     */
    @ExceptionHandler//@ExceptionHandler(Exception.class) 括號裏可以可以指定異常類,也可以不指定,可以自動映射
    @ResponseBody
    public Object handle(Exception e){

        //對各種異常進行判斷處理。
        if(e instanceof NullPointerException){
            //處理
        }

        //···


        return e.getMessage();
    }
}

這樣項目發生異常都會被handle方法捕獲並處理返回給客戶端。

AOP處理HTTP請求日誌

新建一個HttpAspect類,用@component+@Aspect註解標識。代表此類是一個切面。

package com.tellhow.demo.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;


@Aspect
@Component
public class HttpAspect {
    private static Logger logger= LoggerFactory.getLogger(HttpAspect.class);

    /**
     * 此方法用來做表達式的,切入點表達式,即要增強哪些方法。
     */
    @Pointcut("execution(public * com.tellhow.demo.controller.UserController.getUsers())")
    public void log(){//
    }

    @Before("log()")
    public void logBefore(){
        logger.info("before........................");
    }

    @After("log()")
    public void logAfter(){
        logger.info("after***************************");
    }

    @After("log()")
    public void logDetailAfter(JoinPoint point){
        ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request =attributes.getRequest();
        //請求url
        logger.info("url={}",request.getRequestURI());
        //請求方法
        logger.info("method={}",request.getMethod());
        //請求ip
        logger.info("ip={}",request.getRemoteAddr());
        //類方法
        logger.info("class_method={}",point.getSignature().getDeclaringType()+"."+point.getSignature().getName());
        //參數
        logger.info("args={}",point.getArgs());

    }

    @AfterReturning(returning = "object",pointcut = "log()")//獲得被增強方法的返回值。
    public void doAfterReturning(Object object){
        System.out.print(object.toString());
    }
}

想要對哪些方法記錄日誌,直接寫切點的表達式內即可。

以上即一個完整的springboot項目,東西雖少,五臟俱全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章