我有一个 Spring Boot 2.5.4 应用程序,我想在其中添加 Redis 并通过 Spring Data Redis 访问它。我当前的配置如下所示:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/>
</parent>
<groupId>com.application</groupId>
<artifactId>ApiGateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ApiGateway</name>
<description>ApiGateway</description>
<properties>
<java.version>15</java.version>
<spring-boot-starter-redis.version>2.5.0</spring-boot-starter-redis.version>
<redis.version>3.1.0</redis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot-starter-redis.version}</version>
</dependency>
<!-- OTHER DEPENDENCIES -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${redis.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cognitoidp</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!-- OTHER DEPENDENCIES --> …Run Code Online (Sandbox Code Playgroud) 我有一种方法可以为从API请求调用中接收到的对象列表计算营养素。
该方法如下所示:
public Nutrients nutrientsCalculator(DailyMeals dailyMeals) {
String foodNamesForRequest = prepareFoodNamesForRequest(dailyMeals);
HttpEntity<NutrientsBodyForRequest> requestBody = prepareRequestForAPICall(foodNamesForRequest);
ResponseEntity<List<FoodNutritional>> response =
//create request here
if (nonNull(response.getBody())) {
double totalFat = response.getBody()
.stream()
.map(FoodNutritional::getTotalFat)
.mapToDouble(Double::doubleValue)
.sum();
double totalProtein = response.getBody()
.stream()
.map(FoodNutritional::getProtein)
.mapToDouble(Double::doubleValue)
.sum();
double totalCarbohydrates = response.getBody()
.stream()
.map(FoodNutritional::getTotalCarbohydrate)
.mapToDouble(Double::doubleValue)
.sum();
double totalDietaryFiber = response.getBody()
.stream()
.map(FoodNutritional::getDietaryFiber)
.mapToDouble(Double::doubleValue)
.sum();
return Nutrients.builder()
.carbohydrates(totalCarbohydrates)
.protein(totalProtein)
.fat(totalFat)
.dietaryFiber(totalDietaryFiber)
.build();
}
return new Nutrients();
}
Run Code Online (Sandbox Code Playgroud)
我的FoodNutritional.class看起来像:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
class …Run Code Online (Sandbox Code Playgroud) 我想与我在 docker 中运行的 MongoDB 数据库建立连接。应用程序似乎开始时没有任何问题,但是当我尝试调用简单的 GET 之类的任何请求时:
localhost:8082/devices
Run Code Online (Sandbox Code Playgroud)
根据配置,我收到两个不同的错误:
有属性:
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.host=interviewTest
spring.data.mongodb.port=27017
spring.data.mongodb.username=mongoadmin
spring.data.mongodb.password=secret
server.port=8082
spring.data.mongodb.uri=mongodb://localhost:27017
spring.data.mongodb.database=interviewTest
Run Code Online (Sandbox Code Playgroud)
我收到:
com.mongodb.MongoQueryException: Query failed with error code 13 and error message 'command find requires authentication' on server localhost:27017
Run Code Online (Sandbox Code Playgroud)
对于具有不同配置的 application.properties:
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.port=27017
spring.data.mongodb.username=mongoadmin
spring.data.mongodb.password=secret
server.port=8082
spring.data.mongodb.database=interviewTest
spring.data.mongodb.uri=mongodb://mongoadmin:secret@localhost:27017/interviewTest?retryWrites=true&w=majority
Run Code Online (Sandbox Code Playgroud)
com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }
Run Code Online (Sandbox Code Playgroud)
我创建了我的 MongoDB docker 容器,如下所示: …
我在我的应用程序中使用公共 API Nutritionix 从他们的数据库中获取有关食品成分的详细信息。我想测试一种方法,该方法向公共 API 发送 POST 请求以接收有关产品营养价值的详细信息,然后在我的应用程序的下一个过程中使用它们。
我的测试类如下所示:
@ExtendWith(MockitoExtension.class)
class CaloriesServiceTest {
@InjectMocks
private CaloriesService caloriesService;
@Mock
private RestTemplate restTemplate;
@Mock
private NutritionixHeader nutritionixHeader;
@BeforeEach
void setUp() {
caloriesService = new CaloriesService(nutritionixHeader, restTemplate);
}
@Test
void receiveNutritionInformationFromAPI() {
given(nutritionixHeader.getNutritionixAppId()).willReturn("secretID");
given(nutritionixHeader.getNutritionixAppKey()).willReturn("secretKey");
var meal1 = Meal.builder()
.mealIngredients(List.of(RecipeIngredient.builder()
.foodName("grilled fish")
.build()))
.build();
var meal2 = Meal.builder()
.mealIngredients(List.of(RecipeIngredient.builder()
.foodName("eggs")
.build()))
.build();
var meal3 = Meal.builder()
.mealIngredients(List.of(RecipeIngredient.builder()
.foodName("bacon")
.build()))
.build();
var dailyMeals = DailyMeals.builder().dailyMeals(List.of(meal1, meal2, meal3)).build();
var foodNutritional1 = FoodNutritional.builder().foodName("food name1").calories(11.1).build();
var foodNutritional2 = …Run Code Online (Sandbox Code Playgroud) 我想在 java 中的字符串列表中计算单个单词的出现次数。看似这个任务很简单,但我遇到了一个问题,单词以大写字母开头或包含,或.在单词末尾。我的方法看起来像:
public static Long countWordOccurence(List<String> wordList, String word) {
return wordList.stream()
.filter(s -> word.contains(s))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.values()
.stream()
.findFirst()
.orElse((long) -1);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在正常情况下工作正常,但问题发生在像字符串末尾的昏迷Test,或以大写字母开头的字符串这样的角落情况下。
我正在拆分我的字符串列表,如:
Arrays.asList(TEXT_TO_PARSE.split(" "));
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我会很感激避免额外的依赖,但如果有必要,我不会鄙视。
我将不胜感激关于如何在流中修复我的过滤器子句以正确计算字符串的建议。
假设我有一些课程来说明歌曲和投票的问题。
用户.java
@EqualsAndHashCode
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "users")
public class User {
@Id private String id;
private String username;
private String email;
private Integer age;
private String password;
@DBRef(db = "interview", lazy = true)
@EqualsAndHashCode.Exclude
@ToString.Exclude
private Set<Song> songs;
}
Run Code Online (Sandbox Code Playgroud)
歌曲.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Song {
@Id private String id;
private String title;
private String author;
private SongGenre songGenre;
Set<Vote> votesOfSong;
}
Run Code Online (Sandbox Code Playgroud)
投票.java
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "votes")
@Getter
public class Vote {
@Id …Run Code Online (Sandbox Code Playgroud) java functional-programming java-stream spring-webflux java-11
我想使用 docker 镜像启动 MySQL 本地实例。
到目前为止我的docker-compose.yml文件如下所示:
version: '3.3'
services:
db:
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./mysql-dump:/docker-entrypoint-initdb.d
restart: always
environment:
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: sqlPractice
MYSQL_USER: admin
MYSQL_PASSWORD: admin
ports:
- '7142:3306'
security_opt:
- seccomp:unconfined
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切正常。我的数据库提供了数据,但在执行一次查询后,如下所示:
SELECT DISTINCT surname, name, data FROM exams e JOIN students s ON e.`id-student` = s.`id-student` WHERE passed='Y' AND (data, `id-centre`) = (SELECT MIN(data), e.`id-centre` FROM exams e JOIN centers c ON e.`id-center` = c.`id-center` WHERE e.passed='Y' AND c.`center-name` = 'IT Institute')
Run Code Online (Sandbox Code Playgroud)
我收到如下错误:
ER_MIX_OF_GROUP_FUNC_AND_FIELDS: …Run Code Online (Sandbox Code Playgroud) 我想总结来自例如的数字。String像 "153" 直到索引 2 并6因为 1+5=6而收到结果。在正常情况下,我会使用经典的循环解决方案,例如检查当前索引是否低于 2:
static int sum(String s){
int sum = 0;
for(int i = 0; i < s.length() ; i++){
if( Character.isDigit(s.charAt(i)) ){
sum = sum + Character.getNumericValue(s.charAt(i));
}
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
上面的方法可以正常工作,但我想将此逻辑重写为 Javastream方法。
我有一个实现,如:
public static int sumDigitsTillIndex(String number) {
return IntStream.range(0, number.length())
.filter(i -> i < 2)
.map(number::charAt)
.sum();
}
Run Code Online (Sandbox Code Playgroud)
对于这个参数 153,我收到了 102,这对我来说是一个惊喜。
我找到了另一个类似的解决方案,例如:
return String
.valueOf(number)
.chars()
.map(Character::getNumericValue)
.sum();
Run Code Online (Sandbox Code Playgroud)
这是正确地对数字求和,但使用其他filter方法,例如:
.filter(index -> number.charAt(index) < …
假设我有一个方法,addVoteToSong例如:
public Mono<Map<Song, VoteKind>> addVoteToSong(Principal principal, String songId, VoteKind voteKind) {
return
userRepository.findUserByUsername(principal.getName())
.doOnSuccess(song -> songRepository.findSongById(songId))
.doOnSuccess(vote -> voteRepository.add(Vote.builder().song()))
.//(the rest of the code)
}
Run Code Online (Sandbox Code Playgroud)
我想从该行传递一个结果:
userRepository.findUserByUsername(principal.getName())
Run Code Online (Sandbox Code Playgroud)
和
.doOnSuccess(song -> songRepository.findSongById(songId))
Run Code Online (Sandbox Code Playgroud)
到该行中的构建对象:
.doOnSuccess(vote -> voteRepository.add(Vote.builder().song(here result from findSongById).user(here result from findUserByUsername))
Run Code Online (Sandbox Code Playgroud)
那么问题来了,是否可以在下一个doOnSuccess方法中重用以前的API调用结果,或者我应该同时拆分find API调用,放弃Reactor的级联操作?在互联网上,我找到了save没有基于反应流的间接结果的单一方法的例子,这就是问题发生的原因。我将不胜感激有关如何实现目标的建议。
java ×8
java-stream ×4
docker ×2
java-11 ×2
java-8 ×2
spring-boot ×2
jedis ×1
junit ×1
lambda ×1
mockito ×1
mongodb ×1
mysql ×1
redis ×1
spring ×1
unit-testing ×1