Comments (2)
Can you elaborate more on this?
Based on this excerpt from the readme:
Alternatively you can annotate an interface:
@Spec(path="firstName", params="name", spec=Like.class) public interface NameSpec extends Specification<Customer> { }
and then use it as a controller parameter without any further annotations.
You can separate your specification object into its own interface.
Here's an example that we use in our project (modified for demonstration purposes):
@And({
// for URL query ?id=12&id=99
@Spec(path = "id", params = "id", spec = In.class),
// for POST json: { filter: { id: [12, 99] } }
@Spec(path = "id", jsonPaths = "filter.id", spec = In.class),
// for URL query ?isbn=93-86954-21-4&isbn=93-86837-21-10
@Spec(path = "isbn", params = "isbn", spec = In.class),
// for POST json: { filter: { isbn: ['93-86954-21-4', '93-86837-21-10'] } }
@Spec(path = "isbn", jsonPaths = "filter.isbn", spec = In.class),
@Spec(path = "author", jsonPaths = "filter.author", spec = In.class),
@Spec(path = "title", params = "title", spec = In.class),
@Spec(path = "publishedDate", params = "publishedDateFrom", spec = GreaterThanOrEqual.class),
@Spec(path = "publishedDate", params = "publishedDateTo", spec = LessThanOrEqual.class)
})
public interface BookSpecification extends Specification<BookEntity> { }
And the controller method is defined like:
public Page<BookDto> listVehiclesBySpec(
// no further annotations required, just use the interface from above:
BookSpecification specification,
@PageableDefault(sort = "publishedDate") Pageable pageable
) {
Page<BookEntity> books = bookRepository.findAll(bookSpecification, pageable);
return new PageImpl<>(
// because we have a dedicated DTO for the response (because serializing entities is bad practice),
// we map the entities to the DTO class here
// alternatively, projections can be used for that
books.stream().map(BookResponseDto::new).toList(),
pageable,
books.getTotalElements()
);
}
Is this what you are aiming for?
from specification-arg-resolver.
Hi, thanks for reply!
I mean that if we place "public interface BookSpecification extends Specification { }" it in presentation layer (the module with controller), we have to reference a domain layer module (with entities) which is not very good.
from specification-arg-resolver.
Related Issues (20)
- Required field HOT 2
- Specification arguments set HOT 1
- Java 17 incompatibility HOT 2
- Can you add SPeL in @Spec constVal with value from headers? HOT 2
- Issue with Join on Hierarchical Entities HOT 1
- [BUG] JoinFetch alias while pagination HOT 5
- Missing support for Spring Boot 3 and transition from javax to jakarta HOT 3
- Redundant proxy is created for multi-spec specifications when expected type is not a spec-interface HOT 3
- Path variables from `@RequestMapping` annotation above the class are not included in springdoc api documentation HOT 1
- Additional specifications HOT 1
- Support for auto-configuration
- Is it possible to reference the indices of the database? HOT 5
- Fail search with an error on unknown search parameters
- Add "description" attribute in the "@Spec" annotation HOT 2
- Json body params should not impose restrictions on requests HOT 3
- Interface extending Specification referenced from a method is not visible from class loader HOT 1
- Specification adds duplicate join when query has been built manually with existing join (Spring Boot 3.x)
- No params in Swagger UI generated by Springdoc-OpenAPI 1.6.13
- Query param with type Integer is not compatible when used with Blaze-Persistence
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from specification-arg-resolver.