我正在寻找一种方法来强制开发人员使用相同的 Java 代码格式规则。我的要求是:
检查代码格式是否正确的任务。如果提交格式不正确的代码,这将用于 CI 导致构建失败
修复格式不正确的代码的任务(很好)
目前我正在使用具有以下配置的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)不受这些缺点的影响?
如果我有一个包含 2 个属性的 Java 记录,并且我想为应该使用的属性定义默认值,而不是 null。我可以重写吸气剂:
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6or 我可以通过覆盖默认构造函数来实现同样的效果:
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n这两个看起来都有点冗长,有没有更简洁的方法来为记录属性分配默认值?
\n当我为 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 存储库来演示该问题。
yarn install && yarn test:unit:coverage以生成覆盖率报告(或使用 npm 代替)coverage/lcov-report/index.html查看报告如果你打开 …
我使用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 以使用相同的格式设置吗?
我正在尝试升级我的 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
应用程序无法启动
描述:
试图调用不存在的方法。尝试是从以下位置进行的:
Run Code Online (Sandbox Code Playgroud)org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:65)以下方法不存在:
Run Code Online (Sandbox Code Playgroud)'int org.flywaydb.core.Flyway.migrate()'该方法的类 org.flywaydb.core.Flyway 可从以下位置获得:
Run Code Online (Sandbox Code Playgroud)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行动:
更正应用程序的类路径,使其包含一个兼容的 org.flywaydb.core.Flyway 版本
我最近将 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 时是否可以记录查询参数值?
在我的 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 组件,它处理访问不存在的路由的尝试,即
'/'有没有一种方法可以支持这些用例而无需重定向两次?
我正在使用Jest的ESLint 插件来整理我的 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 插件。
我正在使用 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 使用哪个版本?
在我的 Vue.js 应用程序中,我有以下内容package.json
"browserslist": [
"> 1%",
"last 2 versions"
]
Run Code Online (Sandbox Code Playgroud)
我相信 Babel 使用它来自定义生成的 JavaScript(其他构建工具也可能使用它)。如果用户尝试在不受支持的浏览器中加载应用程序,我是否可以利用此支持的浏览器列表来显示错误?
我可以编写一些 JavaScript 来检测用户代理,并在浏览器不受支持时显示错误,但这可能需要我在两个地方维护支持的浏览器列表,我宁愿避免这样做。
java ×5
javascript ×3
jestjs ×2
spring-boot ×2
vue.js ×2
babeljs ×1
browser ×1
dependabot ×1
eslint ×1
flyway ×1
gradle ×1
hibernate ×1
npm ×1
record ×1
spotless ×1
vue-router ×1