我使用SpringBoot 3.1.3
java17
,我有类似的情况如下。
我有一个CommonReadOnlyService
这样的:
public class CommonReadOnlyService<T, ID, R extends JpaRepository<T, ID>> {
@Autowired
R repository;
public T findById(ID id) {
Optional<T> entity = repository.findById(id);
if (!entity.isPresent())
throw new EntityNotFoundException(String.format("Entity not founr %d", id));
return entity.get();
}
public List<T> findAll() {
List<T> entity = repository.findAll();
return entity;
}
}
每个其他@Service
扩展上面的一个如下:
@Service
public class UserService extends CommonRedOnlyService<User, Integer, UserRepository> {
}
我也有一个CommonReadOnlyResource
如下:
public abstract class CommonReadOnlyResource<ID, S extends CommonService<?, ID, ?>> {
@Autowired
S service;
@GetMapping("/{id}")
public D findById(ID id) {
return service.findById(id);
}
@GetMapping
public List<D> findAll() {
return service.findAll();
}
}
而每个其他@RestController
扩展了上面的一个。
显然,这样做的原因是为了避免为每个Controller重写findById()
和findAll()
方法。
但是这样我如何指定不同findById()
和findAll()
资源的OpenaAPI Swagger 3 @operation
和@ApiResponse
?
有办法吗?
非常感谢您的回复@zufar-sunagatov,但我的想法有点不同。extends
CommonReadOnlyService
的所有服务将不会重新定义findById()
和findAll()
方法。
我需要一些技巧来把一个通用的定义放在这里:
public abstract class CommonReadOnlyResource<ID, S extends CommonService<?, ID, ?>> {
@Autowired
S service;
@Override
@Operation(summary = "Find a {?} by the id", description = "Get a {?} by specifying the id of the {?}.", tags = { "?" })
@ApiResponses({
@ApiResponse(responseCode = "200", content = { @Content(schema = @Schema(implementation = {?}.class), mediaType = "application/json") }),
@ApiResponse(responseCode = "404", description = "The user is not found.")
})
@GetMapping("/{id}")
public D findById(ID id) {
return service.findById(id);
}
@GetMapping
public List<D> findAll() {
return service.findAll();
}
}
例如,关于模式,我在某处读到过类似这样的内容:@Schema(anyOf = User.class, Car.class ecc..)
,但我不知道我是否可以为所有其他注解做同样的事情。
2条答案
按热度按时间egdjgwm81#
我正在使用SpringBoot 3.1.3 java 17,我遇到了类似于以下的情况。
我有CommonReadOnlyService
我也有一个CommonReadOnlyResource和其他@RestController扩展了上面的一个。
但是这样我如何指定OpenaAPI Swagger3 @操作和不同的findById()和findAll()资源的@ApiResponse?
是的,你可以使用
@OperationOverride
注解,它允许你覆盖超类中方法的@Operation
注解。例如,你可以用下面的方法覆盖
UserService
类中的findById()
方法:pgx2nnw82#
我用这种配置解决了:
在资源
@Tag
上添加@Extension
:在架构中检索正确的Object。
我不知道这是否是一个最好的做法,任何帮助都是高度赞赏的,但与此同时,希望有所帮助。