spring-boot mybatis-plus的项目中会添加一个controller,定义好curd的功能,然后其他controller继承,自动实现curd的功能
MpCurdController.java
package com.litong.spring.boot.v158.mp.layui.v255.controller;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.litong.spring.boot.v158.mp.utils.LayuiUtils;
import com.litong.spring.boot.v158.mp.vo.JsonBean;
import com.litong.spring.boot.v158.mp.vo.PageJsonBean;
import com.litong.utils.array.LArrays;
import com.litong.utils.reflection.LReflectionUtils;
import com.litong.utils.string.StringUtil;
import lombok.extern.slf4j.Slf4j;
/**
 * @author bill robot
 * @date 2020年6月10日_上午10:37:50 
 * @version 1.0 
 * @desc
 */
@Slf4j
public class MpCurdController<Service extends IService<Entity>, Entity> {
  @Autowired
  private Service s;
  @RequestMapping("list")
  public PageJsonBean<Entity> list(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, String orderBy, boolean isAsc,Entity e) {
    e = LReflectionUtils.convertEmpytStringToNull(e);
    log.info("pageSize:{},pageNo:{},e {}", pageSize, pageNo, e);
    Map<String, Object> map = LReflectionUtils.convertObjectToMap(e);
    QueryWrapper<Entity> queryWrapper = new QueryWrapper<>();
    if (orderBy != null) {
      queryWrapper.orderBy(true, isAsc, orderBy);
    }
    for (Map.Entry<String, Object> m : map.entrySet()) {
      if (m.getKey().equals("id")) {
        queryWrapper.eq("id", m.getValue());
      } else {
        queryWrapper.like(m.getKey(), m.getValue());
      }
    }
    Page<Entity> page = new Page<>(pageNo, pageSize);
    IPage<Entity> result = s.page(page, queryWrapper);
    PageJsonBean<Entity> pageJsonBean = new PageJsonBean<>(result);
    return pageJsonBean;
  }
  @RequestMapping("listColumn")
  public JsonBean<List<Entity>> listColumn(String column, Entity e) {
    String mName = "listColumn";
    log.info("{},column {} entity {}", mName, column, e);
    QueryWrapper<Entity> queryWrapper = new QueryWrapper<Entity>();
    queryWrapper.select("id", column);
    Map<String, Object> map = LReflectionUtils.convertObjectToMap(e);
    for (Map.Entry<String, Object> m : map.entrySet()) {
      if (m.getKey().equals("id")) {
        queryWrapper.eq("id", m.getValue());
      } else {
        queryWrapper.like(m.getKey(), m.getValue());
      }
    }
    List<Entity> list = s.list(queryWrapper);
    JsonBean<List<Entity>> jsonBean = new JsonBean<>(list);
    return jsonBean;
  }
  @RequestMapping("getById")
  public JsonBean<Entity> get(String id) {
    log.info("get by id {}", id);
    Entity byId = s.getById(id);
    JsonBean<Entity> jsonBean = new JsonBean<>(byId);
    return jsonBean;
  }
  @RequestMapping("removeById")
  public JsonBean<Boolean> removeById(String id) {
    String methodName = "removeById";
    log.info("{} by id {}", methodName, id);
    boolean isNumeric = StringUtil.isNumeric(id);
    boolean b = false;
    if (isNumeric) {
      b = s.removeById(Integer.parseInt(id));
    } else {
      b = s.removeById(id);
    }
    return buildJsonBean(methodName, b);
  }
  @RequestMapping("removeByIds")
  public JsonBean<Boolean> removeByIds(@RequestParam(value = "ids[]") String[] ids) {
    String methodName = "removeByIds";
    log.info("{} {}", methodName, ids);
    if (ids.length < 1) {
      return new JsonBean<Boolean>();
    }
    boolean isNumeric = StringUtil.isNumeric(ids[0]);
    List<? extends Serializable> idList = null;
    if (isNumeric) {
      int[] intIds = new int[ids.length];
      for (int i = 0; i < ids.length; i++) {
        intIds[i] = Integer.parseInt(ids[i]);
      }
      idList=LArrays.toList(intIds);
    } else {
      idList = LArrays.toList(ids);
    }
    boolean b = s.removeByIds(idList);
    return buildJsonBean(methodName, b);
  }
  @RequestMapping("save")
  public JsonBean<Boolean> save(Entity e) {
    String methodName = "save";
    log.info("{} {}", methodName, e);
    boolean b = s.saveOrUpdate(e);
    return buildJsonBean(methodName, b);
  }
  @RequestMapping("update")
  public JsonBean<Boolean> update(Entity e) {
    String methodName = "update";
    log.info("{} {}", methodName, e);
    boolean b = s.saveOrUpdate(e);
    return buildJsonBean(methodName, b);
  }
  @RequestMapping("saveOrUpdate")
  public JsonBean<Boolean> saveOrUpdate(Entity e) {
    String methodName = "saveOrUpdate";
    log.info("{} {}", methodName, e);
    boolean b = s.saveOrUpdate(e);
    return buildJsonBean(methodName, b);
  }
  public JsonBean<Boolean> buildJsonBean(String methodName, boolean b) {
    return LayuiUtils.buildJsonBean(methodName,b);
  }
}其他的controller集成
package com.litong.spring.boot.v158.layui.v255.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.litong.spring.boot.v158.layui.v255.entity.FormComplaint;
import com.litong.spring.boot.v158.layui.v255.service.FormComplaintService;
import com.litong.spring.boot.v158.mp.layui.v255.controller.MpCurdController;
/**
 * <p>
 * 投诉单 前端控制器
 * </p>
 *
 * @author litong
 * @since 2020-06-01
 */
@RestController
@RequestMapping("/formComplaint")
public class FormComplaintController extends MpCurdController<FormComplaintService,FormComplaint> {
  
}我上面的功能移植到jfinal中遇到了问题,下面的移植的步骤和遇到的问题
父controler,保存数据
package com.litong.jfinal.controller;
import com.jfinal.core.Controller;
import com.jfinal.core.paragetter.Para;
import com.jfinal.plugin.activerecord.Model;
import com.litong.layui.vo.JsonBean;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LayuiCurdControler<E extends Model<E>> extends Controller {
  public void saveOrUpdate(@Para("")E e) {
    log.info("e:{}",e);
    renderJson(new JsonBean<String>("test success"));
  }
}子类继承
package com.litong.db.controller;
import com.litong.db.monitoring.common.model.DbConnectInfo;
import com.litong.jfinal.controller.LayuiCurdControler;
public class DbConnectInfoController extends LayuiCurdControler<DbConnectInfo>{
}定义路由
package com.litong.jfinal.route;
import com.jfinal.config.Routes;
import com.litong.db.controller.DbConnectInfoController;
import com.litong.jfinal.controller.PathController;
public class BackendRoutes extends Routes {
  public void config() {
    add("/path", PathController.class);
    add("/DbConnectInfo",DbConnectInfoController.class);
  }
}启动测试
http://192.168.0.10:11029/litongjava-jfinal-monitoring-db/DbConnectInfo/saveOrUpdate?jdbcUrl=xx&jdbcUser=xx&jdbcPswd=xx
严重: com.litong.jfinal.controller.LayuiCurdControler.saveOrUpdate(E) : /DbConnectInfo/saveOrUpdate?jdbcUrl=xx&jdbcUser=xx&jdbcPswd=xx
java.lang.RuntimeException: java.lang.InstantiationException at com.jfinal.core.Injector.createInstance(Injector.java:39) at com.jfinal.core.Injector.injectModel(Injector.java:90) at com.jfinal.core.Controller.getModel(Controller.java:778) at com.jfinal.core.paragetter.ModelGetter.get(ModelGetter.java:30) at com.jfinal.core.paragetter.ParaProcessor.get(ParaProcessor.java:51) at com.jfinal.aop.Invocation.<init>(Invocation.java:86) at com.jfinal.core.ActionHandler.handle(ActionHandler.java:90) at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:89) at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:119) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:364) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.InstantiationException at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at com.jfinal.core.Injector.createInstance(Injector.java:37) ... 38 more
问题出现在参数封装中
 
 
 
 
 
 
 
private static T createInstance(Class objClass) {
try {
return objClass.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
而这个方法本质只有一行代码 objClass.newInstance();
应该是你的这个类不允许 newInstance(),检查无参构造方法是否存在