小编sle*_*ske的帖子

BGGA 闭包作为 Java 的附加解决方案?

昨天@headius / Charles Nutter 在推特上提出了一个非常有趣的想法:

@danny_l Gafter 犯了同样的错误;我的意思不是一个分叉的 Java,就像 Groovy 是一个分叉一样。我想要一个带有闭包的“主要是 Java”。

或@danny_l / Danny Lagrouw 的回复:

@headius 或者 BGGA 原型是否可以“固定在”任何未来版本的 Java 上?那可能有用

这也确实是我希望看到的。我们不能有某种字节码预处理器来使 BGGA 原型在任何现代 Java 版本上工作吗?我的意思是 scala、Groovy 和 JRuby 有闭包并生成有效的字节码!

我什至愿意提供帮助并为此付出努力。虽然我真的不知道从哪里开始。

(以上是我写的关于这个主题的博客文章的摘录)

其他人如何看待这个想法?

java closures bgga

5
推荐指数
1
解决办法
636
查看次数

以随机顺序运行TestNG测试

我如何使我的JUnit测试以随机顺序运行相似,我希望TestNG以随机顺序运行我的测试,因此无意识的依赖关系无法进入.

TestNG的手册指出:

默认情况下,TestNG将以随机顺序运行testng.xml文件中的测试.

但是,我用一个简单的testng.xml创建了一个小测试项目:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="My suite">
    <test name="Simple test">
        <packages>
            <package name="testngtests"></package>
        </packages>
    </test>
</suite>
Run Code Online (Sandbox Code Playgroud)

该软件包testngtests包含两个测试类(MyTest1,MyTest2),这些类包含一些空方法,如下所示:

@Test
public void testOne(){

}
Run Code Online (Sandbox Code Playgroud)

测试方法都是空的,只是名称不同.

当我运行它们(使用Eclipse TestNG运行程序或在命令行上)时,测试一致地以相同的顺序运行(即按字母顺序排序,首先按类排序,然后按方法名称排序).

那么文档错了吗?

或者"随机顺序"只是表示"没有保证订单"?然后,我如何让TestNG主动随机化测试订单?

testing testng unit-testing

5
推荐指数
2
解决办法
2175
查看次数

使用HttpUrlConnection在没有中间证书的情况下建立SSL连接

是否可以使用SSL连接到站点,其中客户端只有根证书,但服务器同时具有根证书和中间证书?

我试图使用HttpUrlConnection与包含我的根的TrustManager连接,我得到通常的握手错误:

javax.net.ssl.SSLHandshakeException:
  sun.security.validator.ValidatorException:
  Certificate chaining error
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
Run Code Online (Sandbox Code Playgroud)

我知道一般的解决方案是安装中间证书,但我想避免不断获得供应商X的新中间证书.

我熟悉使用接受所有内容的TrustManager,但这不是一个选项.

java ssl ssl-certificate

5
推荐指数
3
解决办法
5788
查看次数

从选择row_number()over()中选择JPQL

我正在使用as400 db2并试图在JPQL中执行一个查询,该查询将从第x行返回结果到第y行.

在sql中这是我的代码(它运行良好):

select cur.* from (
  SELECT ROW_NUMBER() OVER() AS ROWNUM FROM tableName d) as cur
WHERE cur.ROWNUM > 0 AND cur.ROWNUM < 10
Run Code Online (Sandbox Code Playgroud)

如何将此SQL查询更改为JPQL?我在很多方面尝试过它,但每次我都遇到异常.

这样做的正确方法是什么?我想限制我的结果来自sql查询,而不是使用setMaxResult,setFirstResult方法.

任何帮助将是appritiates,

提前致谢.

jpa jpql

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

使用 JPA 时避免来自 DB 的陈旧数据?

我面临一个类似于Invalidating JPA EntityManager session 中描述的问题:

问题:获取陈旧数据

我们正在 SQL 数据库上运行 JPQL 查询,该数据库也由不同的应用程序同时更改。我们使用的是在Tomcat下运行的JSF+Spring+EclipseLink。

执行 JPQL 查询的类是一个单例 Spring bean,并使用注入的EntityManager

@Component
public class DataRepository{
    @PersistenceContext
    private EntityManager entityManager;
    public List<MyDTO> getStuff(long id) {
        String jpqlQuery ="SELECT new MyDTO([...])";
        TypedQuery<MyDTO> query = entityManager.createQuery(jpqlQuery,MyDTO.class);
        return query.getResultList();
    }
[...]
Run Code Online (Sandbox Code Playgroud)

(代码释义)。

问题是这段代码看不到直接对数据库执行的更改。这些更改仅在 Tomcat 实例重新启动时才可见。

我们尝试过的

我们假设此行为是由与 关联的一级缓存引起的EntityManager,如链接问题中所述。我们找到了两个解决方案:

  • 调用entityManager.clear()调用之前createQuery(这是建议的链接的问题)
  • 注入一个EntityManagerFactor(使用@PersistenceUnit),然后EntityManager为每个查询创建并关闭一个新的

两种解决方案都能满足我们的需求——我们获得了新的数据。

问题:

  • 这两种解决方案是否正确?哪一个更好?
  • 特别是,我们是否可以安全地调用entityManager.clear()注入的 EntityManager,或者这是否会以某种方式影响也使用注入的 EntityManager 的其他代码(在相同或不同的类中)?
  • 有没有不同的、更好的方法?我们能不能以某种方式声明我们想要刷新缓存,或者我们想要一个新的EntityManager

我认为这一定是一个相当普遍的问题(因为它发生在多个应用程序共享一个数据库时),所以我认为必须有一个简单的解决方案......

database spring caching jpa eclipselink

5
推荐指数
2
解决办法
6637
查看次数

当脚本在HTML textarea中显示时,是否可以进行XSS攻击?

我的UI中有一个HTML textarea(用于基于Java的Web应用程序),用户可以在其中输入任何值.保存后,它将显示在浏览器中的textarea(已禁用)中.

如果用户在textarea中输入任何脚本作为自由文本,它是否会作为脚本执行(即使值显示在textarea中,而不是作为标签/文本显示)?

java browser security xss web-applications

5
推荐指数
1
解决办法
2839
查看次数

Java往返String - > float - > String甚至(某些)值不能表示为float?

正如许多地方所解释的那样(例如为什么十进制数不能用二进制数精确表示?),并非所有小数部分都可以表示为浮点值(例如存储float在Java中).

给出的典型示例是"0.2".根据这个漂亮的IEEE 754转换器,float最接近0.2的是大约0.20000000298023224,因此解析"0.2"作为a float应该产生这个结果.

但是,我注意到Java似乎能够做到这一点:

String number="0.2";
float f = Float.parseFloat(number);
System.out.println("Result of roundtrip String -> float -> String: "+f);
Run Code Online (Sandbox Code Playgroud)

打印:

往返字符串的结果 - > float - >字符串:0.2

在IDeone.com上测试

Java如何知道我想要(舍入)输出"0.2",而不是如上所述的精确输出"0.20000000298023224"?

的Javadoc中Float.toString()试图解释这一点:

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与float类型的相邻值区分开来.

不幸的是,这让我更加困惑.为什么"打印尽可能多的数字来唯一区分参数值"允许Java打印"0.2"?

理想情况下,答案也可以解释为什么选择此打印算法.这个例子是(一些)往返工作吗?还有其他动机吗?

java math floating-point numbers type-conversion

5
推荐指数
1
解决办法
204
查看次数

JAXB:在解组期间未继承的命名空间注释 - JDK 1.8_102中的回归?

我遇到了JAXB拒绝解组XML元素的情况,除非相应的Java字段具有命名空间注释.此行为仅在JDK 1.8.0_111(或可能在102)中启动.早期版本的JDK 1.8可以使用.

测试用例:

Java类(缩写):

package my.package;
@XmlRootElement(name = "MyElement", namespace="myns")
public class MyElement {
    @XmlElement(name = "subEl")
    private String subEl;
}
Run Code Online (Sandbox Code Playgroud)

XML:

<MyElement xmlns="myns">
    <subEl>text1</subEl>
</MyElement>
Run Code Online (Sandbox Code Playgroud)

package-info.java:

@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package my.package;
Run Code Online (Sandbox Code Playgroud)

解组代码:

    JAXBContext jc = JAXBContext.newInstance(MyElement.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    MyElement myel = (MyElement) unmarshaller.unmarshal(xmlStream);
    System.out.println("Parse result: "+ myel);
Run Code Online (Sandbox Code Playgroud)

使用JDK 1.8.0_101(及更早版本)打印:

解析结果:MyElement [subEl = subEl]

使用JDK 1.8.0_111,我得到:

解析结果:MyElement [subEl = null]

所以JDK 1.8.0_111拒绝解组元素"MyElement".

如果我在字段注释上指定命名空间:

    @XmlElement(name = "subEl", namespace="myns")
    private String subEl;
Run Code Online (Sandbox Code Playgroud)

它在所有JDK版本中都按预期工作.


这里发生了什么?

据我所知,该设置elementFormDefault = XmlNsForm.QUALIFIED应该导致类MyElement的所有字段"继承"该类的命名空间.该 …

java xml jaxb xml-namespaces unmarshalling

5
推荐指数
1
解决办法
1028
查看次数

检索最大/最小记录

我正在研究的一个相当复杂的SQL查询让我思考(ANSI)SQL的局限性:

有没有办法检索关于任意排序的最大或最小记录?

换一种说法:

给出这样的查询:

SELECT * FROM mytable WHERE <various conditions> ORDER BY <order clause>
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个只返回第一行的查询(可能通过将order子句转换为其他内容)?

我知道你可以使用LIMIT(MySQL)/ ROWNUM(Oracle)或类似的方法来做到这一点,但这不是标准的SQL.

我也知道你可以通过在子查询中获取你感兴趣的最大/最小值(使用MIN()/ MAX())来做到这一点,然后在主SELECT中使用该结果作为标准,即:

SELECT * FROM mytable WHERE <various conditions> AND myMaxColumn=(
  SELECT MAX(myMaxColumn) FROM mytable WHERE <various conditions>
)
Run Code Online (Sandbox Code Playgroud)

但这只有在我想按单列排序时才有效.我认为没有办法将它推广到多个列(除了嵌套上面的解决方案,但这意味着当用n coluns排序时有2 ^ n个SELECT).

那么标准SQL中有一种比嵌套多个子选择更好的方法吗?

创建SQL查询中询问相关问题以检索最近的记录.但是,那里的答案建议使用LIMIT和朋友,或使用带有MAX()的子查询,如上所述,这两个都不是我的问题的解决方案.

sql theory relational

4
推荐指数
2
解决办法
317
查看次数

一个有一个成员的结构,有时需要```,有时不需要

我正在研究一个程序,它struct在许多地方使用泛型来绕过相关的值.该结构包含一个字段char* s.

许多功能修改s; 但是,有时结构用于将信息传递给只读取它的函数.在这些情况下,用于初始化的字符串通常s是a const char*.但是,将其分配会s导致编译器警告.

虽然技术上是正确的,但这个警告感觉不对,因为该功能不会修改s.有没有办法绕过这个警告,除了扔掉const?有没有办法让函数承诺它会将struct成员视为const

例:

#include <stdio.h>

struct mystruct{
  int i;
  char* s;
};

void i_only_read(const struct mystruct *m){
  printf("mystruct: i=%d, s=%s\n", m->i, m->s);
}

int main(int argc, char **argv){
  const char* cstr = "Hello";
  struct mystruct m;
  m.i=99;
  /* gcc warning: assignment discards ‘const’ qualifier
   * from pointer target type
   */
  m.s=cstr;
  i_only_read(&m);
}
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 我无法将结构的声明更改为const char* s,因为大多数指向结构的函数都会修改s …

c warnings const

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