Contenu connexe Plus de VMware Tanzu (20) Modern Persistence with Spring Data 32. People Standing on Platform of a Subway Station - Niklas Jeromin - https://www.pexels.com/
4. Baseline
Framework 6
/*
* Extend Future with the capability to accept completion callbacks.
* @deprecated as of 6.0, in favor of CompletableFuture
*/
@Deprecated(since = "6.0")
public interface ListenableFuture<T> extends Future<T> { ... }
future.addCallback(
it -> { ... },
exception -> { ... }
);
future.whenComplete(
(it, exception) -> { ... }
);
5. Minimum Baseline
Java 17
Framework 6
Jakarta EE 9
/*
* Extend Future with the capability to accept completion callbacks.
* @deprecated as of 6.0, in favor of CompletableFuture
*/
@Deprecated(since = "6.0")
public interface ListenableFuture<T> extends Future<T> { ... }
future.addCallback(it -> { ... }, exception -> { ... });
future.whenComplete((it, exception) -> { ... });
6. RxJava1 & RxJava2 support
discontinued
import io.reactivex.Maybe;
interface RxPersonRepository extends RxJava2CrudRepository {
Maybe<Person> findPersonById(Long id);
}
import io.reactivex.rxjava3.core.Maybe;
interface RxPersonRepository extends RxJava3CrudRepository {
Maybe<Person> findPersonById(Long id);
}
7. import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
Baseline
Jakarte EE 9
-Drewrite.activeRecipes=org.openrewrite.java.migrate.JavaxMigrationToJakarta
$> java -jar spring-boot-migrator.jar
jee-project:> apply initialize-spring-boot-migration
SBM
$> find * -name '*.java' | xargs perl -pi -e "s/javax.persistence./jakarta.persistence./g"
Bash
9. In October 2022, the Apache Geode project failed to secure at
least three voting members on the PMC required to maintain
and manage the Apache Geode Project, after which it was
moved to the foundations Attic.
Spring Data for Apache Geode
discontinued
21. @SpringBootApplication
public class SpringDataMongodbObservabilityApplication {
@Bean
CommandLineRunner initDatabase(EmployeeRepository repository, ObservationRegistry registry) {
// ...
}
@Bean
MongoClientSettingsBuilderCustomizer mongoContextProvider(ObservationRegistry registry) {
return (clientSettingsBuilder) ->
clientSettingsBuilder.contextProvider(ContextProviderFactory.create(registry))
.addCommandListener(new MongoObservationCommandListener(registry));
}
}
Observability
Data MongoDB
22. @SpringBootApplication
public class SpringDataMongodbObservabilityApplication {
@Bean
CommandLineRunner initDatabase(EmployeeRepository repository, ObservationRegistry registry) {
return args -> {
Observation.createNotStarted("init-database", registry).observe(() -> {
repository.save(new Employee("Frodo", "ring bearer"));
repository.save(new Employee("Bilbo", "burglar"));
});
};
}
@Bean
MongoClientSettingsBuilderCustomizer mongoContextProvider(ObservationRegistry registry) {
return (clientSettingsBuilder) ->
clientSettingsBuilder.contextProvider(ContextProviderFactory.create(registry))
.addCommandListener(new MongoObservationCommandListener(registry));
}
}
Observability
Data MongoDB
25. @Query(value = "select u.* from User u", queryRewriter = TenantQRW.class)
List<User> findUsers(Pageable pageable);
static class TenantQRW implements QueryRewriter {
@Override
public String rewrite(String query, Sort sort) {
return query + " WHERE u.tenantId = " + context.getTenantId();
}
}
Data JPA
Query Rewriter
27. @Query("SELECT * FROM person WHERE username = :#{ principal?.username }")
Person findActiveUser();
Data JDBC
SpEL Expressions
33. Person existing = template.update(Person.class)
.matching(where("firstname").is("Harry"))
.apply(new Update().inc("age", 1))
.findAndModifyValue();
@Update("{ '$inc' : { 'age' : ?1 } }")
Person findAndIncrementAgeByFirstname(String firstname, int increment);
Data MongoDB
findAndModify
37. public class User {
@JsonView(Basic.class)
private int id;
@JsonView(Basic.class)
private String name;
@JsonView(Detailed.class)
private String email;
}
Data Redis
Object Mapping
new GenericJackson2JsonRedisSerializer(objectMapper, JacksonObjectReader.create(),
(mapper, source) -> mapper.writerWithView(Basic.class).writeValueAsBytes(source)
);
41. public class Person {
String id;
String name;
@EncryptedField(algorithm = SHA_512_Deterministic)
String ssn;
@EncryptedField(algorithm = SHA_512_Random, altKeyName = "secretKey")
String wallet;
@EncryptedField(algorithm = SHA_512_Random, altKeyName = "/name")
Address address;
}
Encryption
client side
42. public class Person {
String id;
String name;
@EncryptedField(algorithm = SHA_512_Deterministic)
String ssn;
@EncryptedField(algorithm = SHA_512_Random, altKeyName = "secretKey")
String wallet;
@EncryptedField(algorithm = SHA_512_Random, altKeyName = "/name")
Address address;
}
Encryption
client side
{
"_id": "ff3-4567-ee",
"name": "chris",
"ssn": {
"$binary": {
"base64": "AVpT0rwbK0P
"subType": "06"
}
},
"wallet": {
"$binary": {
"base64": "AlpT0rwbK0P
"subType": "06"
}
},
"address": {
"$binary": {
"base64": "+T3C+n4HOBF
"subType": "06"
}
},
"_class": ”example.Person"
}