发生异常时记录响应正文

2023-12-21

我在用retrofit对于 http 调用gson作为转换器。 在某些情况下,当 gson 尝试将响应转换为对象时,我会抛出异常,我想知道在这种情况下的实际响应是什么。
例如: 这是我收到的异常消息:

Expected a string but was BEGIN_OBJECT at line 1 column 26 path $[0].date

执行调用的代码如下:

Gson gson = gsonBuilder.create();
Retrofit retrofit = (new retrofit2.Retrofit.Builder()).baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create(gson)).client(httpClient).build();
MyService service = retrofit.create(clazz);
...
Response<T> response = service.call().execute();

当此代码引发异常时,我想以某种方式记录原始响应正文。我怎样才能做到这一点?


我认为这并不容易完成。 Retrofit 似乎没有提供一种跟踪输入流的简单方法(我想到的最自然的地方是CallAdapter.Factory但它不允许无效响应跟踪)。

基本上,非法响应转换应该在特定的转换器中检测到,该转换器的唯一责任是记录无效的有效负载。听起来很像装饰器设计模式。由于Java(不像Kotlin?)不支持装饰器作为一等公民,转发实现可以类似于Google Guava来实现Forwarding***课程:

ForwardingInputStream.java

@SuppressWarnings("resource")
abstract class ForwardingInputStream
        extends InputStream {

    protected abstract InputStream inputStream();

    // @formatter:off
    @Override public int read() throws IOException { return inputStream().read(); }
    // @formatter:on

    // @formatter:off
    @Override public int read(final byte[] b) throws IOException { return inputStream().read(b); }
    @Override public int read(final byte[] b, final int off, final int len) throws IOException { return inputStream().read(b, off, len); }
    @Override public long skip(final long n) throws IOException { return inputStream().skip(n); }
    @Override public int available() throws IOException { return inputStream().available(); }
    @Override public void close() throws IOException { inputStream().close(); }
    @Override public void mark(final int readlimit) { inputStream().mark(readlimit); }
    @Override public void reset() throws IOException { inputStream().reset(); }
    @Override public boolean markSupported() { return inputStream().markSupported(); }
    // @formatter:on

}

ForwardingResponseBody.java

@SuppressWarnings("resource")
abstract class ForwardingResponseBody
        extends ResponseBody {

    protected abstract ResponseBody responseBody();

    // @formatter:off
    @Override public MediaType contentType() { return responseBody().contentType(); }
    @Override public long contentLength() { return responseBody().contentLength(); }
    @Override public BufferedSource source() { return responseBody().source(); }
    // @formatter:on

    // @formatter:off
    @Override public void close() { super.close(); }
    // @formatter:on

}

ForwardingBufferedSource.java

abstract class ForwardingBufferedSource
        implements BufferedSource {

    protected abstract BufferedSource bufferedSource();

    // @formatter:off
    @Override public Buffer buffer() { return bufferedSource().buffer(); }
    @Override public boolean exhausted() throws IOException { return bufferedSource().exhausted(); }
    @Override public void require(final long byteCount) throws IOException { bufferedSource().require(byteCount); }
    @Override public boolean request(final long byteCount) throws IOException { return bufferedSource().request(byteCount); }
    @Override public byte readByte() throws IOException { return bufferedSource().readByte(); }
    @Override public short readShort() throws IOException { return bufferedSource().readShort(); }
    @Override public short readShortLe() throws IOException { return bufferedSource().readShortLe(); }
    @Override public int readInt() throws IOException { return bufferedSource().readInt(); }
    @Override public int readIntLe() throws IOException { return bufferedSource().readIntLe(); }
    @Override public long readLong() throws IOException { return bufferedSource().readLong(); }
    @Override public long readLongLe() throws IOException { return bufferedSource().readLongLe(); }
    @Override public long readDecimalLong() throws IOException { return bufferedSource().readDecimalLong(); }
    @Override public long readHexadecimalUnsignedLong() throws IOException { return bufferedSource().readHexadecimalUnsignedLong(); }
    @Override public void skip(final long byteCount) throws IOException { bufferedSource().skip(byteCount); }
    @Override public ByteString readByteString() throws IOException { return bufferedSource().readByteString(); }
    @Override public ByteString readByteString(final long byteCount) throws IOException { return bufferedSource().readByteString(byteCount); }
    @Override public int select(final Options options) throws IOException { return bufferedSource().select(options); }
    @Override public byte[] readByteArray() throws IOException { return bufferedSource().readByteArray(); }
    @Override public byte[] readByteArray(final long byteCount) throws IOException { return bufferedSource().readByteArray(byteCount); }
    @Override public int read(final byte[] sink) throws IOException { return bufferedSource().read(sink); }
    @Override public void readFully(final byte[] sink) throws IOException { bufferedSource().readFully(sink); }
    @Override public int read(final byte[] sink, final int offset, final int byteCount) throws IOException { return bufferedSource().read(sink, offset, byteCount); }
    @Override public void readFully(final Buffer sink, final long byteCount) throws IOException { bufferedSource().readFully(sink, byteCount); }
    @Override public long readAll(final Sink sink) throws IOException { return bufferedSource().readAll(sink); }
    @Override public String readUtf8() throws IOException { return bufferedSource().readUtf8(); }
    @Override public String readUtf8(final long byteCount) throws IOException { return bufferedSource().readUtf8(byteCount); }
    @Override public String readUtf8Line() throws IOException { return bufferedSource().readUtf8Line(); }
    @Override public String readUtf8LineStrict() throws IOException { return bufferedSource().readUtf8LineStrict(); }
    @Override public int readUtf8CodePoint() throws IOException { return bufferedSource().readUtf8CodePoint(); }
    @Override public String readString(final Charset charset) throws IOException { return bufferedSource().readString(charset); }
    @Override public String readString(final long byteCount, final Charset charset) throws IOException { return bufferedSource().readString(byteCount, charset); }
    @Override public long indexOf(final byte b) throws IOException { return bufferedSource().indexOf(b); }
    @Override public long indexOf(final byte b, final long fromIndex) throws IOException { return bufferedSource().indexOf(b, fromIndex); }
    @Override public long indexOf(final ByteString bytes) throws IOException { return bufferedSource().indexOf(bytes); }
    @Override public long indexOf(final ByteString bytes, final long fromIndex) throws IOException { return bufferedSource().indexOf(bytes, fromIndex); }
    @Override public long indexOfElement(final ByteString targetBytes) throws IOException { return bufferedSource().indexOfElement(targetBytes); }
    @Override public long indexOfElement(final ByteString targetBytes, final long fromIndex) throws IOException { return bufferedSource().indexOfElement(targetBytes, fromIndex); }
    @Override public InputStream inputStream() { return bufferedSource().inputStream(); }
    @Override public long read(final Buffer sink, final long byteCount) throws IOException { return bufferedSource().read(sink, byteCount); }
    @Override public Timeout timeout() { return bufferedSource().timeout(); }
    @Override public void close() throws IOException { bufferedSource().close(); }
    // @formatter:on

}

简单的转发实现只是重写其父类的所有方法并将作业委托给委托对象。一旦扩展了转发类,一些父方法就可以再次被重写。

IConversionThrowableConsumer.java

这只是下面使用的监听器。

interface IConversionThrowableConsumer {

    /**
     * Instantiating {@link okhttp3.ResponseBody} can be not easy due to the way of how {@link okio.BufferedSource} is designed -- too heavy.
     * Deconstructing its components to "atoms" with some lack of functionality may be acceptable.
     * However, this consumer may need some improvements on demand.
     */
    void accept(MediaType contentType, long contentLength, InputStream inputStream, Throwable ex)
            throws IOException;

}

ErrorReportingConverterFactory.java

下一步是实现可以注入的错误报告转换器工厂Retrofit.Builder并监听下游转换器中发生的任何错误。注意它是如何工作的:

  • 对于每个响应转换器,都会注入一个中间转换器。它允许侦听下游转换器中的任何错误。
  • 下游转换器获得不可关闭的资源以避免过早关闭底层 I/O 资源...
  • 下游转换器进行转换,而中间转换器将实际输入流内容收集到缓冲区中,以便用输入流进行响应that may cause GsonConverter fail。这应该被认为是一个瓶颈,因为增长的缓冲区可能会很大(但是,它可能是有限的),当转换器请求时会复制其内部数组等等。
  • If IOException or RuntimeException发生这种情况时,中间转换器将缓冲的输入流内容和实际输入流连接起来,以便让消费者从一开始就接受输入流。
  • 中间转换器负责关闭资源本身。
final class ErrorReportingConverterFactory
        extends Factory {

    private final IConversionThrowableConsumer consumer;

    private ErrorReportingConverterFactory(final IConversionThrowableConsumer consumer) {
        this.consumer = consumer;
    }

    static Factory getErrorReportingConverterFactory(final IConversionThrowableConsumer listener) {
        return new ErrorReportingConverterFactory(listener);
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(final Type type, final Annotation[] annotations, final Retrofit retrofit) {
        return (Converter<ResponseBody, Object>) responseBody -> {
            final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            final InputStream realInputStream = responseBody.byteStream();
            try {
                final ForwardingResponseBody bufferingResponseBody = new BufferingNoCloseResponseBOdy(responseBody, byteArrayOutputStream);
                final Converter<ResponseBody, Object> converter = retrofit.nextResponseBodyConverter(this, type, annotations);
                return converter.convert(bufferingResponseBody);
            } catch ( final RuntimeException | IOException ex ) {
                final InputStream inputStream = concatInputStreams(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), realInputStream);
                consumer.accept(responseBody.contentType(), responseBody.contentLength(), inputStream, ex);
                throw ex;
            } finally {
                responseBody.close();
            }
        };
    }

    private static class BufferingInputStream
            extends ForwardingInputStream {

        private final InputStream inputStream;
        private final ByteArrayOutputStream byteArrayOutputStream;

        private BufferingInputStream(final InputStream inputStream, final ByteArrayOutputStream byteArrayOutputStream) {
            this.inputStream = inputStream;
            this.byteArrayOutputStream = byteArrayOutputStream;
        }

        @Override
        protected InputStream inputStream() {
            return inputStream;
        }

        @Override
        public int read()
                throws IOException {
            final int read = super.read();
            if ( read != -1 ) {
                byteArrayOutputStream.write(read);
            }
            return read;
        }

        @Override
        public int read(final byte[] b)
                throws IOException {
            final int read = super.read(b);
            if ( read != -1 ) {
                byteArrayOutputStream.write(b, 0, read);
            }
            return read;
        }

        @Override
        public int read(final byte[] b, final int off, final int len)
                throws IOException {
            final int read = super.read(b, off, len);
            if ( read != -1 ) {
                byteArrayOutputStream.write(b, off, read);
            }
            return read;
        }

    }

    private static class BufferingNoCloseResponseBOdy
            extends ForwardingResponseBody {

        private final ResponseBody responseBody;
        private final ByteArrayOutputStream byteArrayOutputStream;

        private BufferingNoCloseResponseBOdy(final ResponseBody responseBody, final ByteArrayOutputStream byteArrayOutputStream) {
            this.responseBody = responseBody;
            this.byteArrayOutputStream = byteArrayOutputStream;
        }

        @Override
        protected ResponseBody responseBody() {
            return responseBody;
        }

        @Override
        @SuppressWarnings("resource")
        public BufferedSource source() {
            final BufferedSource source = super.source();
            return new ForwardingBufferedSource() {
                @Override
                protected BufferedSource bufferedSource() {
                    return source;
                }

                @Override
                public InputStream inputStream() {
                    return new BufferingInputStream(super.inputStream(), byteArrayOutputStream);
                }
            };
        }

        /**
         * Suppressing close due to automatic close in {@link ErrorReportingConverterFactory#responseBodyConverter(Type, Annotation[], Retrofit)}
         */
        @Override
        public void close() {
            // do nothing
        }

    }

}

请注意,此实现大量使用转发类,并且仅覆盖必要的内容。

还有一些实用程序,例如连接输入流和使迭代器适应枚举。

迭代器枚举.java

final class IteratorEnumeration<T>
        implements Enumeration<T> {

    private final Iterator<? extends T> iterator;

    private IteratorEnumeration(final Iterator<? extends T> iterator) {
        this.iterator = iterator;
    }

    static <T> Enumeration<T> iteratorEnumeration(final Iterator<? extends T> iterator) {
        return new IteratorEnumeration<>(iterator);
    }

    @Override
    public boolean hasMoreElements() {
        return iterator.hasNext();
    }

    @Override
    public T nextElement() {
        return iterator.next();
    }

}

输入流.java

final class InputStreams {

    private InputStreams() {
    }

    static InputStream concatInputStreams(final InputStream... inputStreams) {
        return inputStreams.length == 2
                ? new SequenceInputStream(inputStreams[0], inputStreams[1])
                : new SequenceInputStream(iteratorEnumeration((Iterator<? extends InputStream>) asList(inputStreams).iterator()));
}

}

OutputStreamConversionThrowableConsumer.java

简单的日志记录实现。

final class OutputStreamConversionThrowableConsumer
        implements IConversionThrowableConsumer {

    private static final int BUFFER_SIZE = 512;

    private final PrintStream printStream;

    private OutputStreamConversionThrowableConsumer(final PrintStream printStream) {
        this.printStream = printStream;
    }

    static IConversionThrowableConsumer getOutputStreamConversionThrowableConsumer(final OutputStream outputStream) {
        return new OutputStreamConversionThrowableConsumer(new PrintStream(outputStream));
    }

    static IConversionThrowableConsumer getSystemOutConversionThrowableConsumer() {
        return getOutputStreamConversionThrowableConsumer(System.out);
    }

    static IConversionThrowableConsumer getSystemErrConversionThrowableConsumer() {
        return getOutputStreamConversionThrowableConsumer(System.err);
    }

    @Override
    public void accept(final MediaType contentType, final long contentLength, final InputStream inputStream, final Throwable ex)
            throws IOException {
        printStream.print("Content type:   ");
        printStream.println(contentType);
        printStream.print("Content length: ");
        printStream.println(contentLength);
        printStream.print("Content:        ");
        final byte[] buffer = new byte[BUFFER_SIZE];
        int read;
        while ( (read = inputStream.read(buffer)) != -1 ) {
            printStream.write(buffer, 0, read);
        }
        printStream.println();
    }

}

把所有的放在一起

final Gson gson = new Gson();
final Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(...)
        .addConverterFactory(getErrorReportingConverterFactory(getSystemOutConversionThrowableConsumer()))
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();
final IWhateverService service = retrofit.create(IWhateverService.class);
final Call<...> call = service.getWhatever("test.json");
call.enqueue(new Callback<...>() {
    @Override
    public void onResponse(final Call<...> call, final Response<...> response) {
        System.out.println(response.body());
    }

    @Override
    public void onFailure(final Call<...> call, final Throwable throwable) {
        throwable.printStackTrace(System.err);
    }
});

注意ErrorReportingConverterFactory必须在之前注册GsonConverterFactory。假设对 JSON 的服务请求最终是非法的:

{"foo":1,###"bar":2}

在这种情况下,错误报告转换器将生成以下转储到标准输出:

Content type:   application/json  
Content length: -1  
Content:        {"foo":1,###"bar":2}  

我不是 Log4j 方面的专家,并且无法找到一种有效的方法来获取输出流以将输入流重定向到。这是我发现的最接近的东西:

final class Log4jConversionThrowableConsumer
        implements IConversionThrowableConsumer {

    private static final int BUFFER_SIZE = 512;

    private final Logger logger;

    private Log4jConversionThrowableConsumer(final Logger logger) {
        this.logger = logger;
    }

    static IConversionThrowableConsumer getLog4jConversionThrowableConsumer(final Logger logger) {
        return new Log4jConversionThrowableConsumer(logger);
    }

    @Override
    public void accept(final MediaType contentType, final long contentLength, final InputStream inputStream, final Throwable ex) {
        try {
            final StringBuilder builder = new StringBuilder(BUFFER_SIZE)
                    .append("Content type=")
                    .append(contentType)
                    .append("; Content length=")
                    .append(contentLength)
                    .append("; Input stream content=");
            readInputStreamFirstChunk(builder, inputStream);
            logger.error(builder.toString(), ex);
        } catch ( final IOException ioex ) {
            throw new RuntimeException(ioex);
        }
    }

    private static void readInputStreamFirstChunk(final StringBuilder builder, final InputStream inputStream)
            throws IOException {
        final Reader reader = new InputStreamReader(inputStream);
        final char[] buffer = new char[512];
        final int read = reader.read(buffer);
        if ( read >= 0 ) {
            builder.append(buffer, 0, read);
        }
    }

}

不幸的是,收集整个字符串的成本可能很高,因此只需要前 512 个字节。这可能需要校准中间转换器中的加入流,以便将内容“向左”“移动”一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发生异常时记录响应正文 的相关文章

  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 改造中的多个队列导致内存不足错误?

    我正在使用retrofit2 做我的项目 当我的呼叫失败时 我再次重复相同的呼叫 重复此 呼叫使我的应用程序强制关闭 当我查看日志时 我得到了错误日志 如下所示 我觉得这是由于同一呼叫的多次排队造成的 所以我在排队之前就这样做了 我打电话给
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级

随机推荐

  • 如何在 Linux 中签署 Mac OS X 应用程序?

    对于 OS X 我在 DMG 内分发 Java 应用程序 自 Mountain Lion 发布以来 打开应用程序会出现以下错误消息 应用程序名称 已损坏且无法打开 您应该弹出 磁盘映像 显然解决方法是签署 app 文件 https blog
  • 使用来自外部文件的数据进行 xUnit 测试

    这些天我试图了解 xUnit 测试的工作原理 特别是 我发现有 3 种方法将数据作为参数传递以测试类方法 InlineData ClassData 和 MemberData 但这是我的问题 是否有机会从外部文件获取这些数据 例如 Json
  • 在我的代码执行中添加延迟的正确方法

    我正在尝试制作一个非常简单的逻辑游戏 这个想法是看到一个带有一定数量的彩色方块 按钮 的矩阵 然后隐藏它们 玩家必须单击彩色方块 所以我需要在绘制方块 按钮和返回原始颜色之间有 2 秒的延迟 所有代码都在一个中实现button click
  • java SDK 中 AmazonDynamoDBClient 和 DynamoDB 类之间的区别?

    我正在使用 Amazon 的 DynamoDB java SDK 想了解两者之间的区别AmazonDynamoDB客户端 https github com aws aws sdk java blob master aws java sdk
  • 填充会增加 div 宽度/高度吗? [复制]

    这个问题在这里已经有答案了 b b
  • 在 RIDE 中导入 Java 库

    我正在尝试在 RIDE 中使用 java 库 我发现了一个很好的教程 https blog codecentric de en 2012 06 robot framework tutorial writing keyword librari
  • 由于 AM 容器,应用程序失败 2 次:以 exitCode: 1 退出

    我在 hadoop 2 7 0 上运行了一个 MapReduce 作业 但 MapReduce 作业无法启动 并且遇到以下错误 Job job 1491779488590 0002 failed with state FAILED due
  • U 矩阵和自组织映射

    我正在尝试理解 SOM 当人们发布代表的图像时 我感到很困惑 数据图像让我使用 SOM 将数据映射到地图空间 据说用的是U矩阵 但我们的神经元网格是有限的 那么如何获得 连续 图像呢 例如 从 40x40 网格开始 有 1600 个神经元
  • OSS Nexus:如何使用 REST API 以文本形式检索最新版本

    我想检索最新版本名称 作为文本 以便能够重命名从 Nexus 检索到的具有时间戳的工件 我所做的是创建一个包含内部 jar 项目 依赖项 相关脚本等多个存档的存档 但是 如果打包的 jar 是快照 则存档在下载时会带有时间戳 这些时间戳替换
  • Bootstrap面板折叠当您单击其中的链接时折叠

    在下面的 HTML 页面中 Heading 1 and Heading 2当页面第一次加载时正确折叠 因为我正在使用class panel collapse collapse Then Collapse Expand当用户单击时工作正常He
  • 在 XAML 中将密码框中的文本居中

    我试图将文本放在密码框中居中 在 Blend 中 用于对齐的文本属性全部被禁用 还有其他方法可以做到这一点吗 感谢您的帮助 Horizo ntalContentAlignment 在 WPF 中工作 但不幸的是在 Silverlight 中
  • 我怎样才能指导更少的人忽略某些风格的数学?

    我正在使用新的calcCSS 中的函数获取对象的宽度 如下所示 width calc 100 40px 不幸的是 由于这是在 LESS 文件中 因此 LESS 在编译时 有效 地将其预先转换为 60 我希望更少地忽视数学calc函数 因为我
  • 如何在 React 应用程序中排除全局样式?

    我在用材质用户界面 https material ui com 用于构建我的 React 项目 然而 有一个组件必须嵌入到不同的站点 意思是 我提供该组件的生产版本以将其嵌入到不同的站点 My React 应用程序的 css正在被覆盖全局样
  • 如何在一个 EC2 实例上运行多个应用程序

    我有几个小型生产站点和一堆有趣的爱好者 实验应用程序等 我想在一个 EC2 实例上运行所有这些 我可以安装一次node js npm express 和 couchdb 然后在不同的端口上运行每个应用程序 并调整我的域注册表中的 dns 设
  • Numpy loadtxt 对数字进行四舍五入

    我正在使用 numpy loadtxt 函数读取大量数据 数据似乎已四舍五入 例如 文本文件中的数字是 3 79000000000005E 01 但 numpy 读取的数字是 37 9 我已在 loadtxt 调用中将 dypte 设置为
  • 相对 z 指数?

    我有一个弹出的 对话框 小部件 其 z 索引为 100 当我创建另一个弹出窗口 浮动 div 时 它出现在对话框小部件下方 因为我没有显式设置 z 索引新的弹出窗口 结构最终看起来像 div div div div div div div
  • Django 重定向功能保留旧的 url 路径

    问题是当我尝试使用时django shortcuts redirect在我的视图函数中 Django 不只是简单地打开新的 url 路径return redirect url 但将所需的 url 路径添加到当前 url 例子当前网址是 主页
  • 将二维数组传递给 C 函数的方法

    我一周前开始学习C语言 为了测试 我决定编写一个井字游戏 我有一块田地 int field 3 3 和一个函数 printField void printField int field 3 3 for int i 0 i lt 3 i fo
  • Java XPath 计算返回类型

    有没有办法确定 XPath 评估的返回类型是什么 我希望 XPath 尽可能通用地匹配 它应该匹配一个节点列表 如果不能匹配 则匹配一个节点 如果不能匹配 则匹配一个值 有没有一种简单的方法可以在Java中实现这个功能 JAXP XPath
  • 发生异常时记录响应正文

    我在用retrofit对于 http 调用gson作为转换器 在某些情况下 当 gson 尝试将响应转换为对象时 我会抛出异常 我想知道在这种情况下的实际响应是什么 例如 这是我收到的异常消息 Expected a string but w