【问题标题】:WeldProxy doesn't recognize source on exceptionWeldProxy 无法识别异常源
【发布时间】:2020-11-16 14:47:31
【问题描述】:

我在使用 Jax-RS、CDI 并在 Wildfly 14 上运行的 Java 8 应用程序中遇到了一个奇怪的问题。

我有这个简单的控制器类:

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>

【问题讨论】:

  • 这个 log4j2 是如何关联的而不是焊接的?为什么“来源”未知是个问题?真正对应的源代码行是上面的一行……实际实现中的第42行。
  • 容器会即时为您的 bean 创建一个代理,因此没有相应的来源。
  • 我想在我的评论中添加一行,但 @Lini 也击败了我。
  • 对不起,这个例子太简单了,没有真正的用处。顺便说一句,我发现我的问题出在哪里,它与 Weld 无关,但这只是我的异常层次结构中的一个错误。

标签: java wildfly cdi log4j2


【解决方案1】:

上面的几个 cmets 有正确的答案:无论出于何种原因,Weld 都认为适合为您的资源类创建客户端代理。客户端代理源(通常)不可用。

现在,真正的问题是:为什么 Weld 为您的资源类创建客户端代理,因为它上面没有范围注释,因此,您认为它会在 @Dependent 范围内?我将猜测 RestEasy 是 Red Hat 编写的 JAX-RS 实现,我假设它作为 WildFly 的一部分提供,默认情况下会生成未注释的资源类 @RequestScoped,而不是 Jersey确实如此,这与@Dependent 范围最接近。而且,最重要的是:@RequestScoped 对象已被代理。

【讨论】:

  • 对不起,这个例子太简单了,没有真正的用处。顺便说一句,我发现我的问题出在哪里,它与 Weld 无关,但这只是我的异常层次结构中的一个错误。
【解决方案2】:

我对 Weld 的“问题”它与 Weld 无关,但它是我的异常层次结构中的一个错误,导致堆栈跟踪丢失。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多