小编Ant*_*gos的帖子

如何实施一致的 Java 代码格式?

我正在寻找一种方法来强制开发人员使用相同的 Java 代码格式规则。我的要求是:

  1. Gradle集成
    1. 检查代码格式是否正确的任务。如果提交格式不正确的代码,这将用于 CI 导致构建失败

    2. 修复格式不正确的代码的任务(很好)

  2. IntelliJ 集成
    1. 可以通过“重新格式化代码”操作在 IDE 中修复格式不正确的代码
    2. IDE 生成的代码(例如 getter/setter 生成)符合规则
  3. 支持OpenJDK /Oracle Java 格式规则

目前我正在使用具有以下配置的Spotless

spotless {
  java {
    toggleOffOn()
    eclipse().configFile("${project.rootDir}/tools/eclipse-java-formatter.xml")
    indentWithSpaces()
    removeUnusedImports()
  }
}
Run Code Online (Sandbox Code Playgroud)

对于 IntelliJ 集成,我安装了Eclipse Code Formatter 插件并将其配置为使用与 Spotless 相同的规则。

除了 2.2 之外,这种方法满足上述所有要求,即 IntelliJ 生成的任何代码在符合格式规则之前都必须重新格式化。另一个问题是,当重新格式化代码时,导入似乎被任意重新排序。这会产生大量虚假更改,从而使拉取请求更难以审查。

是否有另一种方法(例如 CheckStyle)不受这些缺点的影响?

java intellij-idea gradle

28
推荐指数
2
解决办法
2311
查看次数

记录属性的默认值

如果我有一个包含 2 个属性的 Java 记录,并且我想为应该使用的属性定义默认值,而不是 null。我可以重写吸气剂:

\n
public record MyRecord(Set<String> strings, Boolean required) {\n\n    @Override\n    public Boolean required() {\n        return Objects.requireNonNullElse(this.required, Boolean.TRUE);\n    }\n\n    @Override\n    public Set<String> strings() {\n        return Objects.requireNonNullElse(this.strings, Set.of());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6or 我可以通过覆盖默认构造函数来实现同样的效果:

\n
public record MyRecord(Set<String> strings, Boolean required) {\n\n    public MyRecord(Set<String> strings, Boolean required) {\n        this.strings = Objects.requireNonNullElse(strings, Set.of());\n        this.required = Objects.requireNonNullElse(required, Boolean.TRUE);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这两个看起来都有点冗长,有没有更简洁的方法来为记录属性分配默认值?

\n

java record

19
推荐指数
1
解决办法
2万
查看次数

为什么我的 Jest 代码覆盖率报告无效?

当我为 Vue 2.7.X 应用程序生成 Jest 代码覆盖率报告时,报告中显示为已覆盖/未覆盖的行没有任何意义:

在此输入图像描述

此报告中的红色部分应指示测试套件未覆盖(执行)的代码,但显然,将注释(第 290、291 行)显示为未覆盖,或将第 298 行(部分)显示为未覆盖是没有意义的。之前和之后的行都被覆盖。

我猜发生的情况是 Jest 检测到未覆盖的行没有正确映射回源代码,因此 Babel 转译可能存在问题。

我生成代码覆盖率报告,并且yarn jest --coverage应用程序源代码是用 JavaScript(而不是 TypeScript)编写的。

package.json下面显示了可能与问题相关的一些依赖项:

  "devDependencies": {
    "@babel/core": "^7.20.5",
    "@babel/preset-env": "^7.20.2",
    "@vue/test-utils": "1.3.3",
    "@vue/vue2-jest": "29.2.2",
    "@vitejs/plugin-vue2": "^2.2.0",
    "babel-jest": "^29.3.1",
    "http-proxy": "^1.18.1",
    "jest": "^29.3.1",
    "jest-environment-jsdom": "^29.3.1",
    "sass": "1.32.13",
    "sass-lint": "^1.13.1",
    "start-server-and-test": "^1.14.0",
    "unplugin-vue-components": "^0.22.12",
    "vite": "^4.0.1",
    "vite-plugin-rewrite-all": "^1.0.1",
    "vue-template-compiler": "^2.7.14"
  }
Run Code Online (Sandbox Code Playgroud)

最小可重复示例

我创建了一个最小的Git 存储库来演示该问题。

  1. 克隆存储库
  2. 运行yarn install && yarn test:unit:coverage以生成覆盖率报告(或使用 npm 代替)
  3. 打开文件coverage/lcov-report/index.html查看报告

如果你打开 …

javascript code-coverage jestjs babeljs

18
推荐指数
1
解决办法
4910
查看次数

将 IntelliJ 配置为使用与 Spotless 相同的 Java 格式化程序

我使用Spotless Gradle 插件来确保我的应用程序中 Java 代码的格式一致。中的相关条目build.gradle

plugins {
  id "com.diffplug.gradle.spotless" version "3.27.0"
}

spotless {
  java {
    // The available versions of the Eclipse JDT formatter are defined here
    // https://github.com/diffplug/spotless/tree/master/lib-extra/src/main/resources/com/diffplug/spotless/extra/eclipse_jdt_formatter
    eclipse('4.13.0')
    indentWithSpaces()
    removeUnusedImports()
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以配置 IntelliJ 以使用相同的格式设置吗?

java intellij-idea spotless

13
推荐指数
2
解决办法
4695
查看次数

无法将 Spring Boot 应用升级到 Flyway 7.0.0

我正在尝试升级我的 Spring Boot 2.3.4 应用程序以使用 Flyway 7.0.0(最新版本)。以前它使用 Flyway 6.5.6。中的相关条目build.gradle如下所示。

buildscript {
  ext {
    flywayVersion = "7.0.0" // changed from 6.5.6
  }
}

plugins {
  id "org.flywaydb.flyway" version "${flywayVersion}"
}

dependencies {
  implementation "org.flywaydb:flyway-core:${flywayVersion}"
}

flyway {
  url = "jdbc:postgresql://0.0.0.0:5432/postgres"
  user = "postgres"
  password = "secret"
}
Run Code Online (Sandbox Code Playgroud)

当我启动应用程序时发生以下错误,例如 ./gradlew bootRun


应用程序无法启动


描述:

试图调用不存在的方法。尝试是从以下位置进行的:

org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:65)
Run Code Online (Sandbox Code Playgroud)

以下方法不存在:

'int org.flywaydb.core.Flyway.migrate()'
Run Code Online (Sandbox Code Playgroud)

该方法的类 org.flywaydb.core.Flyway 可从以下位置获得:

jar:file:/Users/antonio/.gradle/caches/modules-2/files-2.1/org.flywaydb/flyway-core/7.0.0/623494c303c62080ca1bc5886098ee65d1a5528a/flyway-core-7.0.0.jar!/org/flywaydb/core/Flyway.class
Run Code Online (Sandbox Code Playgroud)

类层次结构是从以下位置加载的:

org.flywaydb.core.Flyway: file:/Users/antonio/.gradle/caches/modules-2/files-2.1/org.flywaydb/flyway-core/7.0.0/623494c303c62080ca1bc5886098ee65d1a5528a/flyway-core-7.0.0.jar
Run Code Online (Sandbox Code Playgroud)

行动:

更正应用程序的类路径,使其包含一个兼容的 org.flywaydb.core.Flyway 版本

java flyway spring-boot

11
推荐指数
2
解决办法
3352
查看次数

如何在 Spring Boot 3/Hibernate 6 中使用查询参数值记录 SQL 语句

我最近将 Spring Boot 应用程序升级到 v3.0,这需要将 Hibernate 升级到 v6.1.5.Final。

我使用 Spring Data JPA 和 Hibernate 作为 JPA 提供程序。当我在本地运行应用程序时,我想记录 SQL 语句以及这些语句中任何参数的值。为此,我按照此博客文章将以下内容添加到本地配置中:

spring:
  jpa:
    show-sql: false
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type.descriptor.sql: trace
Run Code Online (Sandbox Code Playgroud)

我很确定这在升级之前有效,但现在只记录 SQL 语句,即缺少参数值。

使用 Spring Boot v3.0 和 Hibernate v6.1.5.Final 时是否可以记录查询参数值?

java hibernate spring-data-jpa spring-boot

11
推荐指数
1
解决办法
7082
查看次数

在单个 Vue 导航中重定向两次

在我的 Vue 应用程序中,用户的主页取决于他们的角色。为了确保向用户显示正确的主页,我使用了这个导航守卫:

export default (to, from, next) => {
  const authService = getAuthService()

  if (to.path === '/') {
    // if they've requested the home page, send them to 
    // different pages depending on their role
    if (authService.isUser()) {
      next({ name: 'events' })

    } else if (authService.isAdmin()) {
      next({ name: 'admin-events' })

    } else {
      next()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后当用户成功登录时,我将他们重定向到 '/'

  this.$router.push({path: '/'))
Run Code Online (Sandbox Code Playgroud)

上面的导航守卫将它们重定向到特定于角色的主页。但是,不允许在单个导航操作过程中重定向两次,并导致在第二次重定向发生时(在导航防护中)控制台中出现以下错误

未捕获(承诺)错误:通过导航守卫从"/login"到重定向"/"

我的应用程序中发生这种情况的另一种情况是 404 组件,它处理访问不存在的路由的尝试,即

  1. 用户尝试访问无效路由
  2. 404 组件重定向回 '/'
  3. 导航守卫重定向到用户特定的主页,导致错误

有没有一种方法可以支持这些用例而无需重定向两次?

vue.js vue-router

10
推荐指数
1
解决办法
5549
查看次数

仅对某些文件/目录使用 ESLint 插件

我正在使用JestESLint 插件来整理我的 Jest 测试。我的项目结构是

my-project
|
|--tests
   |
   |--unit
   |
   |--e2e
Run Code Online (Sandbox Code Playgroud)

我只希望在掉毛文件时使用的玩笑插件tests/unit目录(因为文件tests/e2e是不是玩笑测试),但是当我运行掉毛,这个插件被应用到下的所有文件tests/unit,从而导致虚假错误的tests/e2e文件。

我可以tests/e2e通过添加以下内容来禁用目录中的单个规则eslintrc.js

module.exports = {
  root: true,
  env: {
    node: true,
    'jest/globals': true
  },
  extends: [
    'eslint:recommended',
    'plugin:jest/recommended',
  ],
  parserOptions: {
    parser: 'babel-eslint'
  },
  plugins: ['jest'],
  "overrides": [
    {
      "files": ["tests/e2e/*.js"],
      "rules": {
        "jest/no-disabled-tests": "off",
        "jest/expect-expect": "off",
        "jest/valid-expect-in-promise": "off"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是tests/e2e我不想禁用目录中的单个规则,而是想完全禁用 Jest 插件。

javascript eslint jestjs

8
推荐指数
2
解决办法
1464
查看次数

为dependabot配置NPM版本

我正在使用 dependentabot 通过以下内容更新我的 NPM 依赖项dependabot.yml

version: 2
updates:
- package-ecosystem: npm
  directory: "/"
  schedule:
    interval: monthly
  rebase-strategy: auto
Run Code Online (Sandbox Code Playgroud)

但 dependentabot 使用的 NPM 版本与我本地安装的版本不同。有没有办法指定 NPM dependentabot 使用哪个版本?

npm dependabot dependabot-script

8
推荐指数
1
解决办法
564
查看次数

如果浏览器不受支持,则显示错误消息

在我的 Vue.js 应用程序中,我有以下内容package.json

  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
Run Code Online (Sandbox Code Playgroud)

我相信 Babel 使用它来自定义生成的 JavaScript(其他构建工具也可能使用它)。如果用户尝试在不受支持的浏览器中加载应用程序,我是否可以利用此支持的浏览器列表来显示错误?

我可以编写一些 JavaScript 来检测用户代理,并在浏览器不受支持时显示错误,但这可能需要我在两个地方维护支持的浏览器列表,我宁愿避免这样做。

javascript browser vue.js

7
推荐指数
1
解决办法
2882
查看次数