小编Ant*_*gos的帖子

自定义Spring Security OAuth 2响应

在我的Java应用程序中,我正在使用Spring Security OAuth 2库来实现OAuth提供程序。对于成功的身份验证(对于authorization_code授予类型)的响应类似于:

{"access_token": "d179bf70-aa40-4df9-a3e1-440e835c273a", 
"expires_in": "43199", 
"refresh_token": "879e7bd0-5e0f-48a9-b64d-f61d5665bf4e", 
"scope": "read", 
"token_type": "bearer"}
Run Code Online (Sandbox Code Playgroud)

有没有办法为此响应添加其他属性,例如用户名或电子邮件地址?

java spring oauth-2.0 spring-security-oauth2

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

在 Spring Boot 项目中使用 Flyway 自动建立数据库基线

我正在尝试将 Flyway 添加到 Spring Boot 项目中。按照说明,我创建了初始 DDL 脚本并将其提交给src/main/resources/db/migration/V1__base_version.sql.

如果我运行基线命令,这将创建flyway_schema_history表并将其中的基线版本设置为1。

虽然这对于我的本地数据库来说效果很好,但我希望这能够在其他开发人员的本地环境、UAT 环境等上自动发生。

我尝试将以下属性添加到 Spring Boot 配置中

spring:
  flyway:
    baseline-on-migrate: true
Run Code Online (Sandbox Code Playgroud)

我希望当 Spring Boot 应用程序启动时,如果该flyway_schema_history表不存在,它会执行与基线命令相同的操作,即创建该表并插入指定当前架构版本的行,但事实并非如此。

有没有办法在应用程序启动时自动为数据库建立基线?

flyway spring-boot

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

运行 Vue 应用程序时出现错误“vue-cli-service:找不到命令”

如果我从 Vue 应用程序的根目录执行以下命令(v.2.6.12)

rm -rf node_modules
npm install
npm run serve
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

sh:vue-cli-service:找不到命令

如果我手动添加以下符号链接则node_modules/.bin不会发生错误

vue-cli-service -> ../@vue/cli-service/bin/vue-cli-service.js
Run Code Online (Sandbox Code Playgroud)

但我不必手动执行此操作,即如果需要此符号链接,则应在@vue/cli-service安装包时创建它。

devDependencies我正在使用 NPM 版本 7.0.3 并在以下部分中声明了以下内容package.json

"@vue/cli-service": "^4.5.6"
Run Code Online (Sandbox Code Playgroud)

npm vue.js vuejs2

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

我需要 @vitejs/plugin-vue 依赖项吗?

我正在尝试将 Vue2 项目从 Vue-CLI/Webpack 迁移到 Vite。本迁移指南@vitejs/plugin-vue应该添加为开发依赖项,但我不确定我是否真的需要它,或者如果需要,我应该使用哪个版本?

GitHub 上的文档没有详细说明该插件的用途或何时安装。

vue.js vuejs2 vite

6
推荐指数
1
解决办法
5078
查看次数

在 Spring Boot 应用程序中使用 AOP 来记录方法调用及其参数

而不是手动编写代码,例如

public void someMethod(Object someArg, Object otherArg) {
    logger.trace("someMethod invoked with arguments {}, {}", someArg, otherArg);    

    // method body
}
Run Code Online (Sandbox Code Playgroud)

我想使用 AOP 自动生成这样的语句。该应用程序是 Spring Boot 2.3.3 应用程序。

我认为不可能为使用 AOP 的所有方法调用生成日志记录语句,而只能为 Spring bean 上的方法调用生成日志记录语句。这对于我当前的目的来说已经足够了。

有人可以解释一下如何向 Spring Boot 应用程序添加一个方面的具体步骤,该方面将为 Spring bean 上的所有方法调用生成如上所述的日志语句吗?如果方面只能拦截公共方法调用,那就足够了。

java logging aop spring-aop spring-boot

5
推荐指数
1
解决办法
7887
查看次数

在部署到 Azure 的 Spring Boot 应用程序中运行计划任务一次

在我的 Spring Boot 应用程序中,我有一个每分钟运行的计划任务。它运行一些查询来查找到期的通知,然后通过电子邮件发送它们

@Service
public class EmailSender {

    @Scheduled(cron = "0 * * * * *")
    public void runTask() {
      // send some emails
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在本地测试时它工作正常,但当我将其部署到 Azure 时,每封电子邮件都会发送 2 个副本。这是因为在 Azure 中,我们运行(至少)2 个容器,这两个容器都启用了调度。

我寻找了每个容器的环境变量,调度程序将检查该环境变量,并且仅在该变量设置为“true”时才运行作业,但找不到任何可靠的方法来实现此目的。

我现在正在考虑以下问题

  • 删除@Scheduled注释
  • 添加公开任务功能的 HTTP 端点(控制器方法)
  • 使用Azure 逻辑应用安排此端点每分钟调用一次(我也考虑过使用WebJobs,但 Linux 上的应用服务尚不支持此功能)。

这似乎增加了很多额外的复杂性,我想知道是否有更简单的解决方案?

java spring scheduled-tasks azure spring-boot

4
推荐指数
1
解决办法
2320
查看次数

测试集合是否只有一个元素与谓词匹配

使用Assertj,我可以anyMatch用来测试集合是否至少有一个元素与谓词匹配,例如

var list = List.of("abc", "xyz")
assertThat(list).anyMatch(element -> element.endsWith("xyz"));
Run Code Online (Sandbox Code Playgroud)

但是我如何测试一个集合是否只有一个与谓词匹配的元素?

java assertj

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

Optional 的这种用法可以变得更实用吗

是否可以使用Optional更多功能,即用isEmpty()处理空情况的可选方法之一替换调用?

public Iterable<User> getOrganisationUsers(final String organisationId) {

  Optional<Organisation> org = organisationRepository.findById(organisationId);

  if (org.isEmpty()) {
    return Collections.emptyList();
  }
  return org.get().getUsers();
}
Run Code Online (Sandbox Code Playgroud)

java optional

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

运行 Cypress 测试时如何等待 AJAX 请求完成?

我有一套针对我的网络应用程序的端到端赛普拉斯测试。当测试运行时,AJAX 调用是针对真实服务器进行的(即请求没有被模拟或存根)。目前,我执行如下操作以确保测试等待这些 AJAX 请求完成

// declare the AJAX request we will wait for
cy.route('POST', '/api/authenticate').as('authenticate')

// type the username and password and click the login button
cy.get('#username').type('john-doe')
cy.get('#password').type('secret')
cy.get('#login-button').click()

// wait for the AJAX request to complete before testing the response code
cy.wait('@authenticate')
cy.get('@authenticate').then(xhr => {    
    expect(xhr.status).to.eq(200)
})
Run Code Online (Sandbox Code Playgroud)

这看起来很冗长,有没有更简单的方法?我正在使用最新版本的 Cypress,v. 6.1.0。

javascript cypress

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

使用WebClient进行Spring Boot集成测试

我正在尝试将 Spring Boot 应用程序的一些集成测试从 迁移RestTemplateWebClient. 目前,测试使用自动装配的实例TestRestTemplate

@Autowired
private TestRestTemplate restTemplate;
Run Code Online (Sandbox Code Playgroud)

运行测试时,restTemplate配置为使用与服务器运行相同的基本 URL 和(随机选择的)端口。

在我的一项测试中,我登录并保存授权响应标头值以供后续 API 调用使用。我尝试将其迁移到WebClient喜欢的样子

WebClient webClient = WebClient.create()

var authResult = webClient.post()
    .uri("/api/authenticate")
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(new LoginDetails(username, password))
    .retrieve()
    .toBodilessEntity()
    .block();

// save the token that was issued and use it for subsequent requests
this.authHeader = authResult.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
Run Code Online (Sandbox Code Playgroud)

但是,当我创建WebClient这样的实例时,它没有配置为使用与应用程序相同的端口。

我尝试使用依赖注入的实例TestWebClient

@Autowired
private WebTestClient webTestClient;
Run Code Online (Sandbox Code Playgroud)

这确实将 Web 客户端连接到服务器(相同的基本 URL 和端口),但是WebTestClientAPI 与WebClient. 具体来说,它似乎只允许断言响应的属性,例如,您可以断言特定的响应标头值存在,但无法保存该标头的值。

var authResult = …
Run Code Online (Sandbox Code Playgroud)

java spring integration-testing spring-boot

0
推荐指数
1
解决办法
3642
查看次数