WeldProxy 无法识别异常来源
WeldProxy doesn't recognize source on exception
我在 Java 8 应用程序中遇到一个奇怪的问题,该应用程序在 Wildfly 14 上使用 Jax-RS、CDI 和 运行。
我有这个简单的控制器 class:
Path("/test")
public class TestController {
private final static Logger logger = LogManager.getLogger();
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Response test(@Context SecurityContext request) {
try (InputStream is = new FileInputStream("properties.txt")) {
System.getProperties().load(is);
} catch (Exception e) {
logger.error("Error", e);
}
return Response.ok().build();
}
调用测试方法总是会抛出异常,因为 properties.txt 不存在,这没关系。奇怪的是,在堆栈跟踪中我有很多未知来源:
[ERROR] [/test/test] [rest.TestController] Error occurs
java.io.FileNotFoundException: properties.txt
at java.io.FileInputStream.open0(Native Method) ~[?:1.8.0_252]
at java.io.FileInputStream.open(FileInputStream.java:195) ~[?:1.8.0_252]
at java.io.FileInputStream.<init>(FileInputStream.java:138) ~[?:1.8.0_252]
at java.io.FileInputStream.<init>(FileInputStream.java:93) ~[?:1.8.0_252]
at com.testapp.rest.TestController.test(TestController.java:42) ~[classes:?]
**at com.testapp.rest.TestController$Proxy$_$$_WeldClientProxy.test(Unknown Source) ~[classes:?]**
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_252]
[...]
粗线是我不理解的那一行。也许是 Wildfly 的错误配置?
顺便说一下,我的 Jax-RS 初始化程序是这样的:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
private static final Logger logger = LogManager.getLogger();
private Set<Object> singletons = new HashSet<Object>();
private HashSet<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
LogFactory.useLog4J2Logging();
classes.add(TestController.class);
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
@Override
public HashSet<Class<?>> getClasses(){
return classes;
}
}
这是我的 log4j2.xml
<Configuration status="WARN">
<Properties>
<Property name="basePath">${logDir}</Property>
<Property name="messagePattern">[%-5level] %X{method}[%logger{2}] %msg</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${messagePattern}\n" />
</Console>
<RollingFile name="File" fileName="${basePath}/app.log" filePattern="${basePath}/app-%d{yyyy-MM-dd}-%i.log" ignoreExceptions="false">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${messagePattern}%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
<DefaultRolloverStrategy max="5" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="File" />
</Root>
<Logger name="org.apache.ibatis.transaction.jdbc.JdbcTransaction" level="ERROR" additivity="false">
<Appender-ref ref="File" level="ERROR" />
<Appender-ref ref="Console" level="ERROR" />
</Logger>
<Logger name="org.apache.ibatis.io" level="ERROR">
<Appender-ref ref="File" />
<Appender-ref ref="Console"/>
</Logger>
<Logger name="org.jboss.resteasy.resteasy_jaxrs.i18n" level="ERROR" additivity="false">
<Appender-ref ref="File" level="ERROR" />
<Appender-ref ref="Console" level="ERROR" />
</Logger>
</Loggers>
</Configuration>
上面的一些评论有正确的答案:无论出于何种原因,Weld 都认为适合为您的资源创建客户端代理 class。客户端代理来源(通常)不可用。
现在,真正的问题是:为什么 Weld 为您的资源创建客户端代理 class,因为它没有范围注释,因此,您会认为,会在 @Dependent
范围?我要猜测 RestEasy,由 Red Hat 编写的 JAX-RS 实现,我假设,作为 WildFly 的一部分发布,使未注释的资源 classes @RequestScoped
默认情况下,而不是 Jersey 所做的,后者最接近于 @Dependent
作用域。而且,最重要的是:@RequestScoped
对象被代理。
我对 Weld 的“问题”与 Weld 无关,但它是我的异常层次结构中的错误,导致堆栈跟踪丢失。
我在 Java 8 应用程序中遇到一个奇怪的问题,该应用程序在 Wildfly 14 上使用 Jax-RS、CDI 和 运行。
我有这个简单的控制器 class:
Path("/test")
public class TestController {
private final static Logger logger = LogManager.getLogger();
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Response test(@Context SecurityContext request) {
try (InputStream is = new FileInputStream("properties.txt")) {
System.getProperties().load(is);
} catch (Exception e) {
logger.error("Error", e);
}
return Response.ok().build();
}
调用测试方法总是会抛出异常,因为 properties.txt 不存在,这没关系。奇怪的是,在堆栈跟踪中我有很多未知来源:
[ERROR] [/test/test] [rest.TestController] Error occurs
java.io.FileNotFoundException: properties.txt
at java.io.FileInputStream.open0(Native Method) ~[?:1.8.0_252]
at java.io.FileInputStream.open(FileInputStream.java:195) ~[?:1.8.0_252]
at java.io.FileInputStream.<init>(FileInputStream.java:138) ~[?:1.8.0_252]
at java.io.FileInputStream.<init>(FileInputStream.java:93) ~[?:1.8.0_252]
at com.testapp.rest.TestController.test(TestController.java:42) ~[classes:?]
**at com.testapp.rest.TestController$Proxy$_$$_WeldClientProxy.test(Unknown Source) ~[classes:?]**
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_252]
[...]
粗线是我不理解的那一行。也许是 Wildfly 的错误配置?
顺便说一下,我的 Jax-RS 初始化程序是这样的:
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
private static final Logger logger = LogManager.getLogger();
private Set<Object> singletons = new HashSet<Object>();
private HashSet<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
LogFactory.useLog4J2Logging();
classes.add(TestController.class);
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
@Override
public HashSet<Class<?>> getClasses(){
return classes;
}
}
这是我的 log4j2.xml
<Configuration status="WARN">
<Properties>
<Property name="basePath">${logDir}</Property>
<Property name="messagePattern">[%-5level] %X{method}[%logger{2}] %msg</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${messagePattern}\n" />
</Console>
<RollingFile name="File" fileName="${basePath}/app.log" filePattern="${basePath}/app-%d{yyyy-MM-dd}-%i.log" ignoreExceptions="false">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${messagePattern}%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
<DefaultRolloverStrategy max="5" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="File" />
</Root>
<Logger name="org.apache.ibatis.transaction.jdbc.JdbcTransaction" level="ERROR" additivity="false">
<Appender-ref ref="File" level="ERROR" />
<Appender-ref ref="Console" level="ERROR" />
</Logger>
<Logger name="org.apache.ibatis.io" level="ERROR">
<Appender-ref ref="File" />
<Appender-ref ref="Console"/>
</Logger>
<Logger name="org.jboss.resteasy.resteasy_jaxrs.i18n" level="ERROR" additivity="false">
<Appender-ref ref="File" level="ERROR" />
<Appender-ref ref="Console" level="ERROR" />
</Logger>
</Loggers>
</Configuration>
上面的一些评论有正确的答案:无论出于何种原因,Weld 都认为适合为您的资源创建客户端代理 class。客户端代理来源(通常)不可用。
现在,真正的问题是:为什么 Weld 为您的资源创建客户端代理 class,因为它没有范围注释,因此,您会认为,会在 @Dependent
范围?我要猜测 RestEasy,由 Red Hat 编写的 JAX-RS 实现,我假设,作为 WildFly 的一部分发布,使未注释的资源 classes @RequestScoped
默认情况下,而不是 Jersey 所做的,后者最接近于 @Dependent
作用域。而且,最重要的是:@RequestScoped
对象被代理。
我对 Weld 的“问题”与 Weld 无关,但它是我的异常层次结构中的错误,导致堆栈跟踪丢失。