小编dma*_*a_k的帖子

Hibernate多态查询

我有两个类,Person和Company,来自另一个类Contact.它们在两个表(Person和Company)中以多态形式表示.简化的类看起来像这样:

public abstract class Contact {

  Integer id;

  public abstract String getDisplayName();

}

public class Person extends Contact {

  String firstName;
  String lastName;

  public String getDisplayName() {
    return firstName + " " + lastName;
  }

}

public class Company extends Contact {

  String name;

  public String getDisplayName() {
    return name;
  }

}
Run Code Online (Sandbox Code Playgroud)

问题是我需要查询查找包含某个字符串的displayName的所有联系人.我不能使用displayName进行查询,因为它不是任何一个表的一部分.有关如何进行此查询的任何想法?

java polymorphism hibernate hql

6
推荐指数
1
解决办法
5183
查看次数

Vaadin替代重载UI

目前我正在编写基于Vaadin的Web应用程序.我对学习周期以及UI的设计方式非常满意.

一般来说,Vaadin的优点是:

  • Java用户的"原生"UI编程(组件层次结构/事件监听器/拖放/验证).
  • 开箱即用的很好的组件集合(树/表/列表/ ...).

缺点是:

  • 大而复杂的HTML输出.这会减慢浏览器的响应时间(在这里那里也会提到)并导致从浏览器到浏览器的一些渲染特性.
  • 处理大量组件的困难(请参阅Can CustomLayout可以处理5000个组件吗?).
  • 如果使用第三方组件,则需要重新编译窗口小部件集.

我对社区的问题是:

什么Web框架最符合以下要求:

  • 使用事件/操作处理程序分离演示文稿.
  • 开箱即用的常用组件(具有表格列拖放,延迟加载等高级功能).
  • 布局支持(没有填充和组件对齐的头痛).
  • 事件传播到服务器和服务器端事件处理.
  • 生成HTML的可能性(如果框架不是基于HTML的)并且还为其捕获事件(例如鼠标点击).
  • 注册关键的加速回调(例如Ctrl-S)的可能性是一个优点.
  • Java开发人员的简短学习曲线是一个优点.

合理的方法组合也适合.请提供"Hello World"应用程序的链接,该链接基于您建议的框架实现.我正在考虑Apache Wicket/Echo2/Tapestry/Click/GWT,但是如果没有玩几个月就很难做出选择(希望没有让人失望).

gwt wicket web-frameworks echo2 vaadin

6
推荐指数
1
解决办法
8716
查看次数

使用Jackson序列化根原始对象

我面临以下问题.当Jackson序列化程序传递一个用于序列化的包装原语时,该原语按原样序列化,例如:

objectMapper = new ObjectMapper();

StringWriter w = new StringWriter();
objectMapper.writeValue(w, Integer.valueOf(10));
System.out.println(w.toString());
Run Code Online (Sandbox Code Playgroud)

产生10输出.但是,10它不是一个有效的JSON(根据jsonlint),应该用方括号([10]因此它将是一个单元素数组)或大括号({value:10}因此它将是一个具有虚拟属性的对象)包装.该问题影响的数字,java.lang.String,java.util.Date,...

我的问题是:如何让杰克逊进行包装?Jackson不应该总是生成有效的JSON吗?

我已经SerializationConfig.Feature.WRAP_ROOT_VALUE启用了杰克逊的行为分析:它不能像我预期的那样工作.现在,基元被序列化为有效的JSON({"Integer":10}),但"正常"的Java bean也被包装,这是不希望的({"MyBean":{"field":value, ...}}而不是{"field":value, ...}).

如果有人可以建议如何定制杰克逊,也许可以使用自定义序列化器.难点在于有必要区分根原语包装器(需要包装)和bean原始属性(不需要包装).

为了使故事完整:Jackson序列化程序被用作Spring MVC的消息转换器,我怀疑编写一个钩子来拦截原语序列化(它不会调用Jackson但只会"[" + String.toString(obj) + "]"在必要时返回)相当容易.所以我更喜欢调优杰克逊的解决方案.

java serialization json jackson

6
推荐指数
1
解决办法
1764
查看次数

如何从一个.spec生成特定于平台和平台的RPM子包?

我有dunno.spec以下结构的文件:

Name:                   dunno
Vesion:                 1.0
...
BuildArch:              x86_64

%description
...
%package common
Summary:                Shared files
BuildArch:              noarch
Run Code Online (Sandbox Code Playgroud)

我想在运行后rpmbuild -ba dunno.spec我应该得到两个二进制包:

  • dunno-1.0.x86_64.rpm
  • dunno-common-1.0.noarch.rpm

但我得到:

  • dunno-1.0.x86_64.rpm
  • dunno-common-1.0.x86_64.rpm

如果我BuildArch: x86_64从规范中删除该行,那么我得到

  • dunno-1.0.noarch.rpm
  • dunno-common-1.0.noarch.rpm

如何解决?

RPM v4.4.2.3.

rpm rpmbuild

6
推荐指数
1
解决办法
6920
查看次数

在网站上启用“粘贴”的脚本

问题涉及特定站点:NS.nl 上的门票订单。在该页面上有用于输入电子邮件的文本输入字段,该字段禁用了 Ctrl-V(粘贴)。

问题:什么 Greasemonkey 脚本可以在字段上启用粘贴?

我研究了各种解决方案,即:

并来到以下脚本(不幸的是)不适用于给定站点(使用 FF v40、Greasemonkey v3.4 进行测试):

// Taken from http://userscripts-mirror.org/scripts/review/40760
unsafeWindow.disable_paste = function() { return true; };

// jQuery is already available on the page:
var $j = jQuery.noConflict();

// Site generates the form on-the-fly, so we schedule the necessary modifications for later:
setTimeout(function() {
    $j(document).off('copy paste', '[data-regex=email], [data-regex=emailRepeat]');
    $j(document).off('keyup keydown keypress cut copy paste');

    // Taken from /sf/ask/1978668261/
    $j('*').each(function(){                                                
        $j(this).unbind('paste');
    });
}, 2000);
Run Code Online (Sandbox Code Playgroud)

使用延迟执行(via setTimeout())是因为站点动态构建表单。“有问题”元素显示在以下屏幕截图中:

已禁用粘贴的表单字段元素

javascript browser clipboard greasemonkey copy-paste

6
推荐指数
2
解决办法
4490
查看次数

如何将 Spring 事务传播到另一个线程?

也许,我做错了什么,但我找不到以下情况的好方法。

我想对一个在下面使用Spring Batch来执行作业的服务进行单元测试。作业通过AsyncTaskExecutor在单独的线程中预先配置来执行。在我的单元测试中,我想:

  1. 创建少量域对象并通过 DAO 持久化它们
  2. 调用服务方法来启动作业
  3. 等待作业完成
  4. 使用 DAO 检索域对象并检查它们的状态

显然,以上所有内容都应该在一个事务中执行,但不幸的是,事务不会传播到新线程(我理解这背后的基本原理)。

我想到的想法:

  • 在步骤 (1) 之后提交事务 #1。不好,因为数据库状态应该在单元测试后回滚。
  • Isolation.READ_UNCOMMITTED在作业配置中使用。但这需要两种不同的配置用于测试和生产。

java spring multithreading transactions propagation

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

URLConnection无法正确处理代理的内容长度

我遇到了以下问题:当URLConnection通过代理使用时,内容长度始终设置为-1.

首先,我检查了代理确实返回Content-Length(lynx并且wget也通过代理工作;没有其他方法从本地网络上网):

$ lynx -source -head ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
HTTP/1.1 200 OK
Last-Modified: Mon, 09 Jul 2007 17:02:37 GMT
Content-Type: application/x-zip-compressed
Content-Length: 30745
Connection: close
Date: Thu, 02 Feb 2012 17:18:52 GMT

$ wget -S -X HEAD ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
--2012-04-03 19:36:54--  ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
Resolving proxy... 10.10.0.12
Connecting to proxy|10.10.0.12|:8080... connected.
Proxy request sent, awaiting response...
  HTTP/1.1 200 OK
  Last-Modified: Mon, 09 Jul 2007 17:02:37 GMT
  Content-Type: application/x-zip-compressed
  Content-Length: 30745
  Connection: close
  Age: 0
  Date: …
Run Code Online (Sandbox Code Playgroud)

java proxy urlconnection http-proxy

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

正则表达式匹配引号中带有双引号的字符串

我面临着以下列格式匹配输入的挑战:

  • 输入由键=值对组成.关键始于斜线.该值可以是引号中的数字或字符串.
  • 该值可以选择包含转义引号,即引号后跟引号("").这种逃逸的报价应被视为价值的一部分.无需检查转义的报价是否平衡(例如,以另一个转义报价结束).

正则表达式应该与序列的给定key = value部分匹配,并且不应该为长输入中断(例如,值为10000个字符).

首先我来到这个解决方案:

/(\w+)=(\d+|"(?:""|[^"])+"(?!"))
Run Code Online (Sandbox Code Playgroud)

并且它执行得不错,但是在Java6中,对于长输入(例如,cashes regexplanet),StackOverflowError失败了.我尝试改进它以便更快地运行:

/(\w+)=(\d+|"(?:""|[^"]+)+"(?!"))
Run Code Online (Sandbox Code Playgroud)

但是如果输入不匹配,它会在回溯中进入无限循环,试图匹配它.

然后我来到这个正则表达式:

/(\w+)=(\d+|".+?(?<!")(?:"")*"(?!"))
Run Code Online (Sandbox Code Playgroud)

表现较慢,但它似乎解决了这个任务.

任何人都可以建议更好/更快的正则表达式?

样本输入:

/mol_type="protein" /transl_table=11 /note="[CDS] (""multi
line)"  nn  /organism="""Some"" Sequence" nn  /organism="Some ""Sequence"""
/translation="MHPSSSRIPHIAVVGVSAIFPGSLDAHGFWRDILSGTDLITDVPSTHWLVE
DYYDPDPSAPDKTYAKRGAFLKDVPFDPLEWGVPPSIVPATDTTQLLALIVAKRVLEDAAQGQFE
SMSRERMSVILGVTSAQELLASMVSRIQRPVWAKALRDLGYPEDEVKRACDKIAGNYVPWQESSF
PGLLGNVVAGRIANRLDLGGTNCVTDAACASSLSAMSMAINELALGQSDLVIAGGCDTMNDAFMY
MCFSKTPALSKSGDCRPFSDKADGTLLGEGIAMVALKRLDDAERDGDRVYAVIRGIGSSSDGRSK
SVYAPVPEGQAKALRRTYAAAGYGPETVELMEAHGTGTKAGDAAEFEGLRAMFDESGREDRQWCA
LGSVKSQIGHTKAAAGAAGLFKAIMALHHKVLPPTIKVDKPNPKLDIEKTAFYLNTQARPWIRPG
DHPRRASVSSFGFGGSNFHVALEEYTGPAPKAWRVRALPAELFLLSADTPAALADRARALAKEAE
VPEILRFLARESVLSFDASRPARLGLCATDEADLRKKLEQVAAHLEARPEQALSAPLVHCASGEA
PGRVAFLFPGQGSQYVGMGADALMTFDPARAAWDAAAGVAIADAPLHEVVFPRPVFSDEDRAAQE
ARLRETRWAQPAIGATSLAHLALLAALGVRAEAFAGHSFGEITALHAAGALSAADLLRVARRRGE
LRTLGQVVDHLRASLPAAGPAASASPAAAASVPKASTAAVPAVASVAAPGAAEVERVVMAVVAET
TGYPAEMLGLQMELESDLGIDSIKRVEILSAVRDRTPGLSEVDASALAQLRTLGQVVDHLRASLP
AASAGPAVAAPAAKAPAVAAPTGVSGATPGAAEVERVVMAVVAETTGYPAEMLGLQMELESDLGI
DSIKRVEILSAVRDRTPGLAEVDASALAQLRTLGQVVDHLRASLGPAAVTAGAAPAEPAEEPAST
PLGRWTLVEEPAPAAGLAMPGLFDAGTLVITGHDAIGPALVAALAARGIAAEYAPAVPRGARGAV
FLGGLRELATADAALAVHREAFLAAQAIAAKPALFVTVQDTGGDFGLAGSDRAWVGGLPGLVKTA
ALEWPEASCRAIDLERAGRSDGELAEAIASELLSGGVELEIGLRADGRRTTPRSVRQDAQPGPLP
LGPSDVVVASGGARGVTAATLIALARASHARFALLGRTALEDEPAACRGADGEAALKAALVKAAT
SAGQRVTPAEIGRSVAKILANREVRATLDAIRAAGGEALYVPVDVNDARAVAAALDGVRGALGPV
TAIVHGAGVLADKLVAEKTVEQFERVFSTKVDGLRALLGATAGDPLKAIVLFSSIAARGGNKGQC
DYAMANEVLNKVAAAEAARRPGCRVKSLGWGPWQGGMVNAALEAHFAQLGVPLIPLAAGAKMLLD
ELCDASGDRGARGQGGAPPGAVELVLGAEPKALAAQGHGGRVALAVRADRATHPYLGDHAINGVP
VVPVVIALEWFARAARACRPDLVVTELRDVRVLRGIKLAAYESGGEVFRVDCREVSNGHGAVLAA
ELRGPQGALHYAATIQMQQPEGRVAPKGPAAPELGPWPAGGELYDGRTLFHGRDFQVIRRLDGVS
RDGIAGTVVGLREAGWVAQPWKTDPAALDGGLQLATLWTQHVLGGAALPMSVGALHTFAEGPSDG
PLRAVVRGQIVARDRTKADIAFVDDRGSLVAELRDVQYVLRPDTARGQA"
/note="primer of  Streptococcus pneumoniae
Run Code Online (Sandbox Code Playgroud)

预期输出(来自regexhero.net):

正则表达式

java regex java-6

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

"记忆"类型的驱逐与"计数"类型不同

我想使用Infinispan作为图像二进制数据(Java类型byte[])的缓存.我假设Infinispan默认策略是LIFO或类似的策略,更喜欢保留最近使用/添加的缓存实体.

在我的loadtest场景中,我在一轮中进行四次调用以检索给定的实体.假设第一个调用永远不会到达缓存(因为每一轮都请求一个唯一的实体),但是后面三个总是命中缓存.所以预期的配置文件如下所示:

#1: MISS-HIT-HIT-HIT
#2: MISS-HIT-HIT-HIT
...
Run Code Online (Sandbox Code Playgroud)

当我使用COUNT具有一定数量实体的驱逐类型配置Infinispan时,它可以正常工作:

<local-cache name="imagesCache" statistics="true">
    <!-- lifespan="30 min" max-idle="30 min" interval="1 min" -->
    <expiration lifespan="1800000" max-idle="1800000" interval="60000" />
    <memory>
        <binary eviction="COUNT" size="500" />
    </memory>
</local-cache>
Run Code Online (Sandbox Code Playgroud)

统计数据显示在运行结束时(以及中间)确切的3/4缓存命中: 在中间缓存COUNT类型的JMX统计信息

基于我在loadtest中捕获的数字的缓存命中率: (2952-738)/2952 = 0.75

当我更改要保留在内存中的实体数量(<binary eviction="COUNT" size="100" />)时,命中率不会改变(如预期的那样).

在运行期间,我测量了负载测试之前和之后的堆大小(在几次GC调用之后进行的测量),结果是500个实体占用大约114.895.000 - 62.445.000 = 52.450.000字节=每个实体大约100KB: 最后缓存COUNT类型的堆统计信息

之后,我重新启动了应用程序,只对缓存配置进行了这么小的改动:

<memory>
    <binary eviction="MEMORY" size="1000000" />
</memory>
Run Code Online (Sandbox Code Playgroud)

我希望Infinispan的性能具有相同的配置文件,但事实证明,一旦给定的内存量完全分配,新添加的实体不会驱逐旧实体但会立即被驱逐.这意味着大约在添加100个实体之后,所有四个缓存结果缓存未命中的请求.可以看出比率现在是0.58而不是0.75: 最后缓存MEMORY类型的堆统计信息

缓存命中率: (2952-738-504)/2952 = 0.579

如果我增加内存,确实命中率接近0.75但是我希望命中率与内存大小无关(假设内存可以适合至少几个实体).

一旦我将钝化配置为文件,基于内存的驱逐策略就会按预期开始工作:

<local-cache name="imagesCache" statistics="true">
    <expiration lifespan="1800000" max-idle="1800000" interval="60000" />
    <persistence passivation="true">
        <file-store …
Run Code Online (Sandbox Code Playgroud)

java caching infinispan evict

5
推荐指数
0
解决办法
278
查看次数

iText7:使用 iText 从 TIFF 多页图像创建 PDF

我正在尝试使用 iText 7.1.1 将 TIFF 图像转换为多页 PDF 文件。感谢那些让我开始阅读这篇文章使用 iText 从 TIFF 图像创建 PDF 的人。但是,它是 iText 5.5.x,我很难在 iText 7 中复制它。

我确实找到了TiffImageData.getNumberOfPages(raf)替换int pages = TiffImage.getNumberOfPages(rafa)

但是,我无法TiffImage.getTiffImage(rafa, i)在 iText7 中进行替换。我需要使用new Image(ImageDataFactory.createTiff(...)). 感谢任何建议。

iText 5.5.x 代码

import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.io.FileChannelRandomAccessSource;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.codec.TiffImage;

public class Test1 {
    public static void main(String[] args) throws Exception {
    RandomAccessFile aFile = new RandomAccessFile("/myfolder/origin.tif", "r"); …
Run Code Online (Sandbox Code Playgroud)

tiff multipage itext7

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