Cola DTO component, unified response
Response content
1. Response failed
2.Single piece of data
3.Multiple pieces of data
4. Paging data
Domain Model
@Getter
@AllArgsConstructor
public enum CatType {<!-- -->
CHINA("Chinese Pastoral Cat"),
PERSIAN("Persian cat"),
TOMCAT("Tom Cat");
private final String desc;
}
@Entity
@Table(name = "tbl_cat")
@Data
@Accessors(chain = true)
@FieldNameConstants
public class Cat {<!-- -->
@Id
private Long id;
@Enumerated(EnumType.STRING)
private CatType type;
private String name;
private Long sellerId;
}
@Entity
@Table(name = "tbl_seller")
@Data
@Accessors(chain = true)
@FieldNameConstants
public class Seller {<!-- -->
@Id
private Long id;
private String name;
private String address;
}
Warehouse
@Repository
public interface CatRepository extends JpaRepository<Cat, Long>, QuerydslPredicateExecutor<Cat> {<!-- -->
}
@Repository
public interface SellerRepository extends JpaRepository<Seller, Long>, QuerydslPredicateExecutor<Seller> {<!-- -->
}
Service
@Slf4j
@Service
@RequiredArgsConstructor
public class CatService {<!-- -->
private final CatRepository catRepository;
public Cat saveCat(Cat cat) {<!-- -->
return catRepository.save(cat);
}
public List<Cat> saveAll(List<Cat> cats) {<!-- -->
return catRepository.saveAll(cats);
}
}
@Service
@Slf4j
@RequiredArgsConstructor
public class SellerService {<!-- -->
private final SellerRepository sellerRepository;
public Seller saveSeller(Seller seller) {<!-- -->
return sellerRepository.save(seller);
}
public List<Seller> findSellers() {<!-- -->
return sellerRepository.findAll();
}
}
Appearance
@Service
@Slf4j
@RequiredArgsConstructor
public class SellCatFacade {<!-- -->
private final CatService catService;
private final SellerService sellerService;
@PostConstruct
public void initData() {<!-- -->
PodamFactory podam = new PodamFactoryImpl();
Seller seller1 = podam.manufacturePojo(Seller.class);
Seller seller2 = podam.manufacturePojo(Seller.class);
sellerService.saveSeller(seller1);
sellerService.saveSeller(seller2);
log.info("Random initialization of 2 seller data completed");
List<Cat> catList = new ArrayList<>();
for (int i = 0; i < 100; i + + ) {<!-- -->
Cat cat = podam.manufacturePojo(Cat.class);
Long sellerId = i % 2 == 0 ? seller1.getId() : seller2.getId();
cat.setSellerId(sellerId);
catList.add(cat);
}
catService.saveAll(catList);
log.info("Random initialization of 100 cat data completed");
}
public Page<List<Map<Expression<?>, ?>>> findCats(CatQry catQry, Pageable pageable) {<!-- -->
QSeller seller = QSeller.seller;
QCat cat = QCat.cat;
BooleanBuilder where = new BooleanBuilder();
Optional.ofNullable(catQry).map(CatQry::getType).ifPresent(v -> where.and(cat.type.eq(v)));
BlazeJPAQuery<Map<Expression<?>, ?>> blazeJPAQuery = DomainFactory.create(BlazeJPAQuery.class);
blazeJPAQuery = blazeJPAQuery
.select(Projections.map(cat, seller))
.from(cat)
.leftJoin(seller).on(cat.sellerId.eq(seller.id))
.where(where)
.orderBy(cat.id.desc());
long fetchCount = blazeJPAQuery.fetchCount();
blazeJPAQuery.offset(pageable.getOffset()).limit(pageable.getPageSize());
List<Map<Expression<?>, ?>> fetchList = blazeJPAQuery.fetch();
return new PageImpl(fetchList, pageable, fetchCount);
}
}
DTO
@Data
public class CatQry extends Query {<!-- -->
private CatType type;
}
Configuration class
@Configuration
public class QueryDSLConfig {<!-- -->
@Bean
public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {<!-- -->
return new JPAQueryFactory(entityManager);
}
@Bean
public CriteriaBuilderFactory createCriteriaBuilderFactory(EntityManagerFactory entityManagerFactory) {<!-- -->
return Criteria.getDefault().createCriteriaBuilderFactory(entityManagerFactory);
}
@Bean
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BlazeJPAQuery<Map<Expression<?>, ?>> blazeJPAQuery(EntityManager entityManager, CriteriaBuilderFactory createCriteriaBuilderFactory) {<!-- -->
return new BlazeJPAQuery<>(entityManager, createCriteriaBuilderFactory);
}
}
Controller
@RestController
@RequiredArgsConstructor
public class SellCatController {<!-- -->
private final SellCatFacade sellCatFacade;
private final SellerService sellerService;
@GetMapping("fail")
public Response fail() {<!-- -->
return SingleResponse.buildFailure("500", "Error response");
}
@GetMapping("findSellers")
public Response findSellers() {<!-- -->
List<Seller> sellers = sellerService.findSellers();
return MultiResponse.of(sellers);
}
@GetMapping("getOneSeller")
public Response getOneSeller() {<!-- -->
Optional<Seller> any = sellerService.findSellers().stream().findAny();
return SingleResponse.of(any);
}
@PostMapping("findCats")
public Response findCats(@RequestBody CatQry catQry, @PageableDefault Pageable pageable) {<!-- -->
Page<List<Map<Expression<?>, ?>>>> listPage = sellCatFacade.findCats(catQry, pageable);
return PageResponse.of(listPage.getContent(), (int) listPage.getTotalElements(), listPage.getSize(), listPage.getNumber());
}
}
Configuration file
server.port: 80
spring.application.name: colo-dto
---
spring:
datasource:
url: jdbc:h2:mem:test
driver-class-name: org.h2.Driver
username: sa
password: Aa123456
h2:
console:
enabled: true
settings:
web-allow-others: true
path: /h2
jpa:
show-sql: true
hibernate:
ddl-auto: update
---
knife4j:
enable: true
openapi:
title: COLA component
description: "`Test`,**COLA Unified Response**"
email: [email protected]
Concat: Jazz
url: https://docs.lab.com
version: v4.0
license: Apache 2.0
license-url: https://docs.lab.com
terms-of-service-url: https://docs.lab.com
group:
test1:
group-name: group name
api-rule: package
api-rule-resources:
- com.lab
Build files
plugins {<!-- -->
id 'java'
id 'org.springframework.boot' version '2.6.13'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.lab'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {<!-- -->
compileOnly {<!-- -->
extendsFrom annotationProcessor
}
}
repositories {<!-- -->
mavenLocal()
maven {<!-- --> url 'https://maven.aliyun.com/repository/public' }
maven {<!-- --> url 'https://maven.aliyun.com/repository/spring' }
mavenCentral()
}
dependencies {<!-- -->
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.alibaba.cola:cola-component-domain-starter:4.3.1'
implementation 'com.alibaba.cola:cola-component-extension-starter:4.3.1'
implementation 'uk.co.jemos.podam:podam:7.2.11.RELEASE'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2:2.1.214'
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor(
"com.querydsl:querydsl-apt:5.0.0:jpa"
,"jakarta.persistence:jakarta.persistence-api",
)
implementation 'com.blazebit:blaze-persistence-integration-querydsl-expressions:1.6.8'
implementation 'com.blazebit:blaze-persistence-integration-hibernate-5.6:1.6.8'
runtimeOnly 'com.blazebit:blaze-persistence-core-impl:1.6.8'
implementation 'com.github.xiaoymin:knife4j-openapi2-spring-boot-starter:4.1.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
sourceSets.main.java.srcDirs + = ['src/main/generated']
compileJava {<!-- -->
options.annotationProcessorGeneratedSourcesDirectory(file('src/main/generated/'))
}
clean {<!-- -->
delete '/src/main/generated'
}
tasks.named('test') {<!-- -->
useJUnitPlatform()
}