小编fge*_*fge的帖子

"规范化"BigDecimal的哈希码:howto?

我有一个用Java编写的JSON Schema实现,它依赖于Jackson(版本2.1.x).出于准确性原因,我告诉杰克逊使用BigDecimal浮点数.

对于JSON Schema的需求,特别需要:对于数值,JSON值相等由其数学值的相等性定义.我需要这种检查,因为,例如,这不是一个合法的模式(一个enum应该是唯一的值):

{ "enum": [ 1, 1.0 ] }
Run Code Online (Sandbox Code Playgroud)

但对于JsonNodes 1和1.0不相等.因此,我编写了番石榴等效的实现,并Set<Equivalence.Wrapper<JsonNode>>在适当的地方使用.此实现应适用于所有类型的节点,而不仅仅是数字节点.

而这个实现中最困难的部分原来是doHash()数字节点:/我需要相同的哈希码来获得等效的数学值,无论它们是整数还是浮点数.

我现在能想到的最好的是:

@Override
protected int doHash(final JsonNode t)
{
    /*
     * If this is a numeric node, we want a unique hashcode for all possible
     * number nodes.
     */
    if (t.isNumber()) {
        final BigDecimal decimal = t.decimalValue();
        try {
            return decimal.toBigIntegerExact().hashCode();
        } catch (ArithmeticException ignored) {
            return decimal.stripTrailingZeros().hashCode();
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java hashcode bigdecimal guava

13
推荐指数
2
解决办法
3317
查看次数

maven:使用相同的pom文件生成几个"工件"?

我这里有一个项目,目前使用一个pom.xml(链接)来生成一个"工件".

我想做的是拆分项目,我们称之为p,进入:

  • p-core,包含核心验证过程;
  • p格式,包含"格式"关键字验证,它取决于p-core.

我想要这样做的原因是依赖性:p-format仅在卷中占据了70%以上,并且JSON Schema的许多用法无论如何都需要格式支持.

我是否需要构建两个完全独立的项目,或者我可以使用一个pom.xml来生成这两个工件吗?我猜后者是可行的,因为很多项目已经做到了(例如杰克逊).

[如果它有任何重要性,我通过Sonatype的maven repo发布]

maven

11
推荐指数
1
解决办法
2万
查看次数

编译器中的错误或我做错了什么?

首先,一些环境:这是Oracle的1.6.0_45 JDK和IDEA 13.1.

我偶然发现了一个最怪异的编译器错误:

public final class AsmFunnels
{
    private AsmFunnels()
    {
    }

    // ...

    public static void funnelFieldNode(final FieldNode node,
        final PrimitiveSink into)
    {
        FieldNodeFunnel.INSTANCE.funnel(node, into);
    }

    // ...

    @ParametersAreNonnullByDefault
    private enum FieldNodeFunnel
        implements Funnel<FieldNode>
    {
        INSTANCE
        {
            @Override
            public void funnel(final FieldNode from, final PrimitiveSink into)
            {
                into.putUnencodedChars(from.name)
                    .putUnencodedChars(from.desc)
                    .putUnencodedChars(from.signature);
            }
        }
    }

    //...

}
Run Code Online (Sandbox Code Playgroud)

Funnel并且PrimitiveSink是从番石榴; 至于FieldNode,它来自ASM 5.0.1(org.objectweb.asm.tree.FieldNode).

请注意,我使用IDEA(13.1如果重要的话).现在,首先,我有一个像这样定义的方法:

public static void funnelFieldNode(final FieldNode node,
    final PrimitiveSink into)
{
    FieldNodeFunnel.INSTANCE.funnel(node, into);
}
Run Code Online (Sandbox Code Playgroud)

IDEA显示没有警告......但编译器不满意: …

java compiler-construction javac intellij-idea

11
推荐指数
1
解决办法
228
查看次数

为什么我不能在这里使用.invokeExact(),即使MethodType没问题呢?

对于我的一个项目,我必须对构造函数进行动态调用.但由于这是Java 7,而不是"经典"反射API,我使用java.lang.invoke.

码:

@ParametersAreNonnullByDefault
public class PathMatcherProvider
{
    private static final MethodHandles.Lookup LOOKUP
        = MethodHandles.publicLookup();
    private static final MethodType CONSTRUCTOR_TYPE
        = MethodType.methodType(void.class, String.class);

    private final Map<String, Class<? extends PathMatcher>> classMap
        = new HashMap<>();
    private final Map<Class<? extends PathMatcher>, MethodHandle> handleMap
        = new HashMap<>();

    public PathMatcherProvider()
    {
        registerPathMatcher("glob", GlobPathMatcher.class);
        registerPathMatcher("regex", RegexPathMatcher.class);
    }

    public final PathMatcher getPathMatcher(final String name, final String arg)
    {
        Objects.requireNonNull(name);
        Objects.requireNonNull(arg);

        final Class<? extends PathMatcher> c = classMap.get(name);
        if (c == null)
            throw new UnsupportedOperationException();

        try {
            return …
Run Code Online (Sandbox Code Playgroud)

java java-7 methodhandle

11
推荐指数
2
解决办法
1655
查看次数

spark java:如何处理multipart/form-data输入?

我正在使用spark来开发Web应用程序; 我想上传文件时出现问题:

public final class SparkTesting
{
    public static void main(final String... args)
    {
        Spark.staticFileLocation("/site");

        Spark.port(8080);

        Spark.post("/upload", (request, response) -> {
            final Part uploadedFile = request.raw().getPart("uploadedFile");
            final Path path = Paths.get("/tmp/meh");
            try (final InputStream in = uploadedFile.getInputStream()) {
                Files.copy(in, path);
            }

            response.redirect("/");
            return "OK";
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

[qtp509057984-36] ERROR spark.webserver.MatcherFilter - 
java.lang.IllegalStateException: No multipart config for servlet
    at org.eclipse.jetty.server.Request.getPart(Request.java:2039)
    at javax.servlet.http.HttpServletRequestWrapper.getPart(HttpServletRequestWrapper.java:361)
    at com.github.fge.grappa.debugger.web.SparkTesting.lambda$main$0(SparkTesting.java:20)
    at com.github.fge.grappa.debugger.web.SparkTesting$$Lambda$1/920011586.handle(Unknown Source)
    at spark.SparkBase$1.handle(SparkBase.java:264)
    at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:154)
    at spark.webserver.JettyHandler.doHandle(JettyHandler.java:60)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:179)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
    at …
Run Code Online (Sandbox Code Playgroud)

java jetty spark-java

11
推荐指数
3
解决办法
1万
查看次数

当我尝试.relativize()路径对另一个路径时,为什么我会得到ProviderMismatchException?

[注:自答问题]

我FileSystem用java.nio 打开了一个zip文件.我Path从那个文件系统得到了一个:

final Path zipPath = zipfs.getPath("path/into/zip");
Run Code Online (Sandbox Code Playgroud)

现在我在本地文件系统上有一个目录,我用它来获取:

final Path localDir = Paths.get("/local/dir")
Run Code Online (Sandbox Code Playgroud)

我想测试是否/local/dir/path/into/zip存在,所以我使用以下方法检查它的存在:

Files.exists(localDir.resolve(zipPath))
Run Code Online (Sandbox Code Playgroud)

但我得到了ProviderMismatchException.为什么?我该如何解决?

java java-7 java.nio.file

10
推荐指数
1
解决办法
1581
查看次数

你如何链接到javadoc中的_package description_(不是类)?

(不,这不是重复,见下文)

对于它的价值,这是Oracle JDK,7u72.

虽然我确实需要,但我无法链接到包描述,因为那里提到了重要的信息,但我每次都没有这样做; 当我尝试{@link my.package.name}或告诉人们去@see my.package.name(甚至链接到外部库的包描述)时,javadoc工具报告它无法找到链接...

那么,我该如何建立这样的链接呢?


好的,所以,有人告诉我这是答案,但不是:

  • 建议的解决方案仅适用于您自己的代码中的包; 我希望能够链接到其他库的包描述;
  • 我希望这些链接在package-info.java和"plain"类javadoc中也有效.

所以,这不是重复的.

java javadoc

10
推荐指数
1
解决办法
373
查看次数

如何让gradle的构建任务生成"常规"jar的影子jar _instead?

(这是使用gradle 2.4)

对于我的一个项目,分成几个子模块,我使用的shadow插件非常适合我的需要; 它有一个main,并且根据插件的自述文件的推荐,我使用应用程序插件与它一起使用,以便在清单中生成Main-Class,一切正常.

现在,这是一个SonarQube插件项目,我也使用(成功!)gradle声纳packagin插件.这个插件的作用是,当你./gradlew build生成声纳插件而不是"常规"jar时.

我希望在这里为我的子项目做同样的事情,除了我希望它只生成影子jar插件而不是"常规"插件...现在我使用这个简单的文件生成两个:

buildscript {
    repositories {
        jcenter();
    }
    dependencies {
        classpath(group: "com.github.jengelman.gradle.plugins",
            name:"shadow", version:"1.2.1");
    }
}

apply(plugin: "application");
apply(plugin: "com.github.johnrengelman.shadow");

dependencies {
    // whatever
}

mainClassName = //whatever

artifacts {
    shadowJar;
}

// Here is the hack...

build.dependsOn(shadowJar);
Run Code Online (Sandbox Code Playgroud)

如何修改此文件以便仅生成阴影jar而不是常规jar?

java gradle gradle-shadow-plugin

10
推荐指数
1
解决办法
1万
查看次数

出于好奇 - 为什么不记录API实现printf() - 就像记录方法一样?

无论是java.util.logging,commons-logging,log4j,还是最新的slf4j和logback,这些API都没有提出方法,例如:

void debug(String format, Object... args);
Run Code Online (Sandbox Code Playgroud)

where format是使用解析的字符串Formatter.相反,他们坚持MessageFormat.

我知道它会与现有的原型冲突,所以为什么不debugf()这样,但为什么没有任何这样的方法Formatter与Java 1.5一样古老?

是出于性能原因,向后兼容......?

(请注意,我真的在谈论Formatter,即包括占位符,如%s,%02x等)

java logging

9
推荐指数
1
解决办法
2295
查看次数

当目标路径是目录时,Files.newInputStream()无关紧要的行为?

注意:请运行以下确切代码; 没有适应它,特别是不要使用File,因为这个bug与新的java.nio.fileAPI有关

好吧,这不是一个"需要回答的问题",而是一个要求见证人的问题......

场景:

  • 你的操作系统上有一个目录,无论它是什么,你知道你有权访问它 - 用Unix的说法,你至少有读取权限(这意味着你可以在其中列出条目); 在下面的代码中,假设所表示的路径System.getProperty("java.io.tmpdir")适合账单;
  • 安装了Oracle JDK或OpenJDK,7+ ; 这样你就java.nio.file可以随意使用了.

现在,下面的代码非常简单:它尝试使用这个目录打开一个新的InputStreamFiles.newInputStream().代码(也可在此处获取 ;添加评论):

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public final class Main
{
    public static void main(final String... args)
        throws IOException
    {
        final Path path = Paths.get(System.getProperty("java.io.tmpdir"));
        try (
            final InputStream in = Files.newInputStream(path); // FAIL_OPEN
        ) {
            final byte[] buf = new byte[1024];
            int bytesRead;
            while ((bytesRead = …
Run Code Online (Sandbox Code Playgroud)

java java.nio.file

9
推荐指数
1
解决办法
801
查看次数