Quarkus 和 MongoPanache 中的原生图像问题
Problem with native image in Quarkus and MongoPanache
我在构建原生 quarkus 图像并尝试使用 mongo panache 查询时遇到问题。
如果我使用开发配置文件或构建普通 jar,一切正常。
这是我的 Dockerfile.native
## Stage 1 : build with maven builder image with native capabilities
FROM quay.io/quarkus/centos-quarkus-maven:19.2.1 AS build
COPY backend /usr/src/app/backend
COPY frontend /usr/src/app/frontend
COPY pom.xml /usr/src/app/
USER root
RUN chown -R quarkus /usr/src/app
USER quarkus
RUN cd /usr/src/app/ && mvn clean package -Pnative -Dnative-image.xmx=4g
RUN mkdir -p /tmp/ssl-libs/lib \
&& cp /opt/graalvm/jre/lib/security/cacerts /tmp/ssl-libs \
&& cp /opt/graalvm/jre/lib/amd64/libsunec.so /tmp/ssl-libs/lib/
## Stage 2 : create the docker final image
FROM registry.access.redhat.com/ubi8/ubi-minimal
WORKDIR /work/
COPY --from=build /usr/src/app/backend/target/*-runner /work/application
COPY --from=build /tmp/ssl-libs/ /work/
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0", "-Djava.library.path=/work/lib", "-Djavax.net.ssl.trustStore=/work/cacerts"]
ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (vert.x-worker-thread-1) HTTP Request to /api/budget failed, error id: 86ff4366-b0d2-49c5-87f7-e6eee9d71feb-1: org.jboss.resteasy.spi.UnhandledException: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class domain.Budget.
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106)
有没有人遇到过类似的问题?
编辑
域(句点和类别也有默认构造函数)
@MongoEntity(collection = "Budget")
public class Budget {
private ObjectId id;
private Period period;
private List<Category> categories;
public Budget() {
period = new Period();
categories = new ArrayList<>();
}
//business method getter setters...
}
存储库
@ApplicationScoped
public class BudgetRepository implements PanacheMongoRepository<Budget> {
}
控制器
@GET
@Path("/budget")
@Produces("application/json")
public Response budget() {
Budget budget = repository.listAll().get(0);
return Response.ok(budget).build();
}
GraalVM 本机图像需要知道 classes 需要通过反射访问。由于您的 REST 端点使用 Response
return 类型,Quarkus 无法自动征集您的 Budget
class 反射,因此您需要为此使用 @RegisterFroReflection
注释。
有一个 PR 会为你做,所以你很快就不再需要自己做:https://github.com/quarkusio/quarkus/pull/6326/files
但是只要这个不合并,就需要在你的Budget
class.
上加上@RegisterFroReflection
注解
我在构建原生 quarkus 图像并尝试使用 mongo panache 查询时遇到问题。 如果我使用开发配置文件或构建普通 jar,一切正常。
这是我的 Dockerfile.native
## Stage 1 : build with maven builder image with native capabilities
FROM quay.io/quarkus/centos-quarkus-maven:19.2.1 AS build
COPY backend /usr/src/app/backend
COPY frontend /usr/src/app/frontend
COPY pom.xml /usr/src/app/
USER root
RUN chown -R quarkus /usr/src/app
USER quarkus
RUN cd /usr/src/app/ && mvn clean package -Pnative -Dnative-image.xmx=4g
RUN mkdir -p /tmp/ssl-libs/lib \
&& cp /opt/graalvm/jre/lib/security/cacerts /tmp/ssl-libs \
&& cp /opt/graalvm/jre/lib/amd64/libsunec.so /tmp/ssl-libs/lib/
## Stage 2 : create the docker final image
FROM registry.access.redhat.com/ubi8/ubi-minimal
WORKDIR /work/
COPY --from=build /usr/src/app/backend/target/*-runner /work/application
COPY --from=build /tmp/ssl-libs/ /work/
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0", "-Djava.library.path=/work/lib", "-Djavax.net.ssl.trustStore=/work/cacerts"]
ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (vert.x-worker-thread-1) HTTP Request to /api/budget failed, error id: 86ff4366-b0d2-49c5-87f7-e6eee9d71feb-1: org.jboss.resteasy.spi.UnhandledException: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class domain.Budget.
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106)
有没有人遇到过类似的问题?
编辑
域(句点和类别也有默认构造函数)
@MongoEntity(collection = "Budget")
public class Budget {
private ObjectId id;
private Period period;
private List<Category> categories;
public Budget() {
period = new Period();
categories = new ArrayList<>();
}
//business method getter setters...
}
存储库
@ApplicationScoped
public class BudgetRepository implements PanacheMongoRepository<Budget> {
}
控制器
@GET
@Path("/budget")
@Produces("application/json")
public Response budget() {
Budget budget = repository.listAll().get(0);
return Response.ok(budget).build();
}
GraalVM 本机图像需要知道 classes 需要通过反射访问。由于您的 REST 端点使用 Response
return 类型,Quarkus 无法自动征集您的 Budget
class 反射,因此您需要为此使用 @RegisterFroReflection
注释。
有一个 PR 会为你做,所以你很快就不再需要自己做:https://github.com/quarkusio/quarkus/pull/6326/files
但是只要这个不合并,就需要在你的Budget
class.
@RegisterFroReflection
注解