我有三个 quarkus 应用程序:
MyApplesRestApp
MyBananasRestApp
MyTomatoesRestApp
这些应用程序重用共享公共库中的一些类
FruitServicesLib
。
在
MyApplesRestApp
中,我有一个简单的异常处理程序来将异常映射到 HTTP 错误 400:
import javax.ws.rs.ext.ExtensionMapper
import javax.ws.rs.ext.Provider
@Provider
public class IllegalArgumentExceptionMapper implements ExtensionMapper<IllegalArgumentException> {
@Override
public Response toResponse(IllegalArgumentException) {
returnResponse.status(Status.BAD_REQUEST).build();
}
}
我想将上面的异常处理程序类移至公共库
FruitServicesLib
,但我也想在MyApplesRestApp
和MyBananasRestApp
中启用此异常处理程序,但不在MyTomatoesRestApp中启用。
最好的方法是什么?如何将 @Provider 注解的类移至公共库,但不始终激活它 - 在需要时有条件地启用它(通过 java 代码或使用某些配置)?
1。扩展解决方案
我使用简单直接的方法实现了这一点,并且异常映射器中有更多我想避免重复的代码。
我的解决方案是从库中删除
@Provider
注释。在 MyApplesRestApp
和 MyBananasRestApp
中,我扩展了该类并添加 @Provider
注释以在项目中启用它。
库中的异常映射器:
import javax.ws.rs.ext.ExtensionMapper;
import javax.ws.rs.ext.Provider;
@Provider
public class IllegalArgumentExceptionMapper implements ExtensionMapper<IllegalArgumentException> {
@Override
public Response toResponse(IllegalArgumentException) {
return Response.status(Status.BAD_REQUEST).build();
}
}
MyApplesRestApp
和MyBananasRestApp
中的异常映射器:
import com.mylib.IllegalArgumentExceptionMapper;
@Provider
public class MyIllegalArgumentExceptionMapper extends IllegalArgumentExceptionMapper {}
2。我有时也使用的另一个解决方案是使用@IfBuildProperty
@Provider
@IfBuildProperty(name = "common.illegal-exception-mapper.enabled", stringValue = "true")
public class IllegalArgumentExceptionMapper implements ExtensionMapper<IllegalArgumentException> {
...
应用程序的application.properties
common.illegal-exception-mapper.enabled=true