jfinal-5.0.0 接收json数据

jfinal 5.0新增了me.setResolveJsonRequest(true);解析 json 请求,本分享是使用该参数的一个实践

源码地址

https://gitee.com/ppnt/java-ee-jfinal-study/tree/master/jfinal-5.0-study/jfinal-5.0.0-web-demo

https://github.com/litongjava/java-ee-jfinal-study/tree/master/jfinal-5.0-study/jfinal-5.0.0-web-demo


添加依赖

pom.xml

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>
  <dependencies>
    <!-- jfinal -->
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal</artifactId>
      <version>5.0.0</version>
    </dependency>

    <!-- jfinal-undertow 开发、部署一体化 web 服务器 -->
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>jfinal-undertow</artifactId>
      <version>3.0</version>
    </dependency>

    <!-- cos 文件上传 -->
    <dependency>
      <groupId>com.jfinal</groupId>
      <artifactId>cos</artifactId>
      <version>2022.2</version>
    </dependency>

    <!-- junit 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.68</version>
    </dependency>

  </dependencies>

配置类

package com.litongjava.jfinal.web.demo.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.template.Engine;

/**
 * 本 demo 仅表达最为粗浅的 jfinal 用法,更为有价值的实用的企业级用法
 * 详见 JFinal 俱乐部: https://jfinal.com/club
 * 
 * API 引导式配置
 */
public class DemoConfig extends JFinalConfig {

  static Prop p;

  /**
   * PropKit.useFirstFound(...) 使用参数中从左到右最先被找到的配置文件
   * 从左到右依次去找配置,找到则立即加载并立即返回,后续配置将被忽略
   */
  static void loadConfig() {
    if (p == null) {
      p = PropKit.useFirstFound("demo-config-pro.txt", "demo-config-dev.txt");
    }
  }

  /**
   * 配置常量
   */
  public void configConstant(Constants me) {
    loadConfig();

    me.setDevMode(p.getBoolean("devMode", false));

    /**
     * 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层,并且自动实现 AOP
     * 注入动作支持任意深度并自动处理循环注入
     */
    me.setInjectDependency(true);

    // 配置对超类中的属性进行注入
    me.setInjectSuperClass(true);
    
    // 开启解析 json 请求,5.0.0 版本新增功能
    me.setResolveJsonRequest(true);
  }

  /**
   * 配置路由
   */
  public void configRoute(Routes me) {
    // 使用 jfinal 4.9.03 新增的路由扫描功能
    me.scan("com.litongjava.jfinal.web.demo.controller.");
  }

  public void configEngine(Engine me) {
  }

  /**
   * 配置插件
   */
  public void configPlugin(Plugins me) {

  }

  /**
   * 配置全局拦截器
   */
  public void configInterceptor(Interceptors me) {

  }

  /**
   * 配置处理器
   */
  public void configHandler(Handlers me) {

  }
}

启动类

package com.litongjava.jfinal.web.demo;

import com.jfinal.server.undertow.UndertowServer;
import com.litongjava.jfinal.web.demo.config.DemoConfig;

/**
 * @author create by Ping E Lee on Oct 17, 2022 8:13:46 AM 
 *
 */

public class WebDemoApp {

  /**
   * 启动入口,运行此 main 方法可以启动项目,此 main 方法可以放置在任意的 Class 类定义中,不一定要放于此
   */
  public static void main(String[] args) {
    UndertowServer.start(DemoConfig.class);
  }
}

实体类

package com.litongjava.jfinal.web.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
  private String username, password;
}

controller

package com.litongjava.jfinal.web.demo.controller;

import com.jfinal.core.Controller;
import com.jfinal.core.Path;
import com.litongjava.jfinal.web.model.User;

import lombok.extern.slf4j.Slf4j;

@Path("/")
@Slf4j
public class IndexController extends Controller {

  public void index() {
    log.info("ok");
    renderText("ok");
  }

  public void receiveUser(User user) {
    log.info("usre:{}", user);
    renderJson(user);
  }

  public void responseUser() {
    User user = User.builder().username("Ping").password("password").build();
    renderJson(user);
  }

}

请求

curl --location --request POST 'http://127.0.0.1/receiveUser' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1' \
--header 'Connection: keep-alive' \
--data-raw '{
    "password": "laboris Duis adipisicing est occaecat",
    "username": "王娜"
}'

测试成功


评论区

星矢

2022-10-18 14:33

很好很好, 而且我发现了,如果参数中没有数据, 仅通过getKv() 的方法是无法获取前端传递的json数据的。

热门分享

扫码入社