我有一个用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) 首先,一些环境:这是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 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) 我正在使用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) [注:自答问题]
我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.为什么?我该如何解决?
(不,这不是重复,见下文)
对于它的价值,这是Oracle JDK,7u72.
虽然我确实需要,但我无法链接到包描述,因为那里提到了重要的信息,但我每次都没有这样做; 当我尝试{@link my.package.name}或告诉人们去@see my.package.name(甚至链接到外部库的包描述)时,javadoc工具报告它无法找到链接...
那么,我该如何建立这样的链接呢?
好的,所以,有人告诉我这是答案,但不是:
所以,这不是重复的.
(这是使用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.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等)
注意:请运行以下确切代码; 没有适应它,特别是不要使用File,因为这个bug与新的java.nio.fileAPI有关
好吧,这不是一个"需要回答的问题",而是一个要求见证人的问题......
场景:
System.getProperty("java.io.tmpdir")适合账单;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 ×9
java-7 ×2
bigdecimal ×1
gradle ×1
guava ×1
hashcode ×1
javac ×1
javadoc ×1
jetty ×1
logging ×1
maven ×1
methodhandle ×1
spark-java ×1