如果我将空列表传递给JPA查询,我会收到错误.例如:
List<Municipality> municipalities = myDao.findAll(); // returns empty list
em.createQuery("SELECT p FROM Profile p JOIN p.municipality m WHERE m IN (:municipalities)")
.setParameter("municipalities", municipalities)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
因为列表是空的,所以Hibernate在SQL中将其生成为"IN()",这使我在Hypersonic数据库中出错.
在Hibernate问题跟踪中有一个这样的票,但那里没有很多评论/活动.我不知道其他ORM产品或JPA规范中的支持.
我不喜欢每次都必须手动检查空对象和空列表的想法.是否有一些众所周知的方法/扩展?你如何处理这些情况?
我正在尝试更改net.core.somaxconn
docker容器,以便能够为我的Web应用程序提供更大的请求队列.
在OS上,在docker之外,我首先成功修改了属性:
$ cat /proc/sys/net/core/somaxconn
128
$ sudo sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
$ cat /proc/sys/net/core/somaxconn
1024
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何将这种变化传播到docker中.我试过了:
/etc/sysctl.conf
(希望docker在容器启动时读取该文件)sudo docker stop
和sudo docker run
再次sudo service docker restart
但在容器内,cat /proc/sys/net/core/somaxconn
总是显示128
.
我正在运行docker 1.2(所以我不能,默认情况下,不能修改/proc
容器内的属性)和Elastic Beanstalk(所以没有--privileged
模式,这将允许我修改/proc
).
如何将sysctl更改传播到docker?
我想以编程方式使用初始数据设置我的数据库.我想填充我的数据库用于开发运行,而不是用于测试运行(这很容易).该产品构建于Spring和JPA/Hibernate之上.
然后:
我想要的是通过必需的部分设置我的环境,以便调用我的DAO并将新对象插入数据库.我不想在原始SQL,XML,转储数据库或其他任何东西中创建初始数据集.我想以编程方式创建对象并将其持久保存在数据库中,就像在普通应用程序逻辑中一样.
实现此目的的一种方法是正常启动我的应用程序并运行一个执行初始化的特殊servlet.但这真的是要走的路吗?我很乐意将初始数据设置作为Maven任务执行,如果我采用servlet方法,我不知道该怎么做.
有一些类似的问题.我快速浏览了建议的DBUnit和Unitils.但他们似乎非常专注于设置测试环境,这不是我想要的.DBUnit执行初始数据填充,但仅使用xml/csv fixtures,这不是我在此之后所做的.然后,Maven有SQL插件,但我不想处理原始SQL.Maven也有Hibernate插件,但它似乎只对Hibernate配置和表模式创建有帮助(而不是用数据填充db).
这该怎么做?
部分解决方案2010-03-19
建议的替代方案是:
我使用Spring的ApplicationListener实现了这个:
类:
public class ApplicationContextListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
...check if database is already populated, if not, populate it...
}
}
}
Run Code Online (Sandbox Code Playgroud)
applicationContext.xml中:
<bean id="applicationContextListener" class="my.namespaces.ApplicationContextListener" />
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法启动ContextStartedEvent,因此我选择了在启动时启动的ContextRefreshedEvent(尚未碰到其他情况).
如何刷新数据库?目前,我只是删除了HSQLDB工件,并在Hibernate启动时生成了新的模式.因为DB也是空的.
我在JSF中通过AJAX更新组件:
<h:form>
<h:outputLink>Click me
<f:ajax event="click" render=":messages" />
</h:outputLink>
</h:form>
<h:messages id="messages" globalOnly="true" />
Run Code Online (Sandbox Code Playgroud)
由于<h:messages />
驻留在外面,<h:form />
我必须在ID前面添加冒号(:
).这有效.
但是,如果我将相同的代码放入组件并将该组件包含到我的页面中,则代码将失败.原因是:messages
声明是指组件层次结构的根,而<h:messages />
我想要更新的组件实际上位于我的自定义组件下,该组件位于页面下(因此位置是样式的:myComponent:messages
.
在我的组件内部,如何实现<h:messages />
组件的正确前缀?我知道我可以手动为我的组件分配ID,并使用它来为引用添加前缀(如:#{cc.attrs.id}:messages
).但是,我不知道这个组件所处的组件层次结构的级别,所以所需的前缀甚至可能是这样的:foo:bar:x:y:messages
.
一些背景:我正在构建一个自定义的JSF组件.该组件基本上是一个文本编辑器,它应该有一个"保存"按钮,用于保存编辑器的内容字符串.当我使用CodeMirror库时,我需要使用javascript从编辑器中获取内容(字符串)并将其发送到服务器.因此,在这种情况下我不能使用基于XML的JS调用等f:ajax
.
问题:我计划发送字符串jsf.ajax.request
,但它不直接支持在bean上调用方法.如何以AJAX方式使用JSF调用bean中的方法?
至少有两种解决方法:
XMLHttpRequest
(或者可能在其他JS库的帮助下)执行请求.创建一个servlet并调用它.两种方式都很笨拙,后者也突破了JSF的范围.
我错过了什么吗?你是怎么做到的?
有一个非常相似的问题,但给出的答案仅涉及基于XML的AJAX调用.还有另一个类似的问题,但它也指基于XML的AJAX调用.
当点击一个按钮时,如何跳过使用JSF的JSR-303 Bean验证?
解释一些方法有点冗长的问题......考虑一个表单中的列表:
<h:form id="form">
<h:commandButton value="Add row">
<f:ajax execute="foo" listener="#{bean.add()}" render="foo" />
</h:commandButton>
<h:dataTable id="foo" var="foo" value="#{bean.foos}">
<h:column>
Name: <h:inputText id="field" value="#{foo.name}" required="true" />
<h:messages for="field" />
</h:column>
<h:column>
<h:commandButton value="Remove">
<f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)
当用户单击添加或删除行时,操作应该在没有验证的情况下执行.问题是,JSF重新呈现整个列表并尝试验证它.如果存在未验证的草稿更改,则会发生验证错误,并且永远不会调用侦听器方法(因为验证失败会阻止该操作).但是,添加immediate="true"
到f:ajax允许方法执行,尽管有验证错误.但是,验证错误仍然会发生并显示在此处.
我看到两个选择:
1)使用immediate ="true"并且不显示验证错误
对于非验证按钮,设置immediate ="true"和h:消息:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Run Code Online (Sandbox Code Playgroud)
然后设置保存按钮(实际上应该尝试保存表单)以发送该参数:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
这会导致验证,但除非SHOW_VALIDATION
存在参数,否则不会显示消息.
2)有条件地在facelets中声明验证:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
并保存按钮:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
这会导致字段仅在VALIDATE
参数存在时进行验证(=按下保存按钮时).
但这些似乎都是一种黑客攻击.我怎样才能简单地使用JSR-303 Bean验证,但在声明时跳过它?
我正在寻找一个工具来帮助设计和实现Java项目的数据库和实体.可能我们正在使用JPA或直接Hibernate.我寻找的功能是:
因此,我们的想法是最初使用可视化工具创建数据库模型,然后自动从中生成实体,然后修改代码并期望可视化图反映更改(因此它可用于文档目的).我想要表格模式的完整表示,而不仅仅是ER图表.
当然还有其他问题,但它们似乎没有特定于Java/JPA,也没有那么严格的要求.它们通常也只是从代码或数据库模式生成图表 - 它们不需要双向支持(如果这是正确的术语).
我到目前为止找到的产品是:
作为结论,Dali似乎最有趣,因为它针对JPA开发.但是,它似乎没有任何形式的可视图(只是轮廓和东西).
有什么建议?
这一定很简单.我试图将子元素传递给JSF组件.我将我的组件声明为:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
</composite:interface>
<composite:implementation>
<div style="border: 1px solid black;">
<ui:insert />
</div>
</composite:implementation>
</html>
Run Code Online (Sandbox Code Playgroud)
然后我在页面中使用它:
<box:box>
<p>Hello world!</p>
</box:box>
Run Code Online (Sandbox Code Playgroud)
不幸的是,盒子呈现好(黑色边框),但"Hello world!" 文本不包含在其中.我也通过使用<ui:insert name="content">
和调用来尝试更详细的语法,<ui:define name="content">Hello World!</ui:define>
但它没有用.
我哪里可能犯错?
我试图通过JSF中的递归来构建导航树.我已将navigationNode
组件定义为:
<composite:interface>
<composite:attribute name="node" />
</composite:interface>
<composite:implementation>
<ul>
<ui:repeat value="#{navigationTreeBean.getChildrenForNode(cc.attrs.node)}" var="child">
<li><navigation:navigationNode node="#{child}" /></li>
</ui:repeat>
</ul>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)
我的树被宣布为:
rootNode = new DefaultMutableTreeNode(new NodeData("Dashboard", "dashboard.xhtml"), true);
DefaultMutableTreeNode configurationsNode = new DefaultMutableTreeNode(new NodeData("Configurations", "configurations.xhtml"), true);
rootNode.add(configurationsNode);
Run Code Online (Sandbox Code Playgroud)
我叫组件:
<nav:navigationNode node="#{rootNode}" />
Run Code Online (Sandbox Code Playgroud)
问题是,这导致了StackOverflowError
.
在JSF中有一些关于构建递归的引用(例如,c:forEach vs ui:在Facelets中重复).常见的问题似乎是混合构建时和渲染时组件/标签.就我而言:
子组件是否在组件navigation:navigationNode
之前实际处理ui:repeat
?如果是这样,它用于什么对象#{child}
?它是否为null(似乎不是这样)?这里的问题是,实际创建子组件时甚至没有关心ui:repeat,所以每次创建一个新的子组件时,即使它不一定需要吗?
该C:VS的forEach UI:重复的Facelets制品具有这种(递归)一个单独的部分.建议是改为使用c:forEach
.我尝试了这个,但它仍然给了我相同的StackOverflowError
,有不同的痕迹,我无法理解.
我知道我们也可以通过扩展来构建组件UIComponent
,但是这种方法(在Java代码中编写html)看起来很难看.我宁愿使用MVC样式/模板.但是,如果没有其他方法,我是否必须将此类递归实现为UIComponent?
我们正在使用Eclipse构建一个(Java)Web项目.默认情况下,Eclipse Cp1252
在Windows机器上使用编码(我们使用).
由于我们在中国也有开发人员(除了欧洲),我开始怀疑这是否真的是要使用的编码.
我最初的想法是转换为UTF-8
,因为"它支持所有字符集".但是,这真的很明智吗?我们应该选择其他编码吗?我看到几个问题:
1)Web浏览器如何解释默认情况下的文件?它取决于使用的语言版本吗?我在这里说的是,我们应该详细声明所使用的编码方案:
<?xml version='1.0' encoding='UTF-8' ?>
声明来详细设置编码.@CHARSET "UTF-8";
.<meta http-equiv="Content-Script-Type" content="text/javascript; charset=utf-8">
或<script type="text/javascript" charset="utf-8">
使用特定脚本.如果我们离开CSS文件而没有@CHARSET "UTF-8";
声明怎么办?浏览器如何确定它的编码方式?
2)是否明智使用UTF-8,因为它是非常灵活.通过将我们的代码锁定Cp1252
(或者可能ISO-8859-1
),我可以确保外国开发人员不会在文件中引入特殊字符.这有效地阻止了他们插入中文评论,例如(我们应该使用100%英语).此外,允许UTF-8有时会让开发人员意外地引入一些奇怪的角色,这些角色很难/不可能被人眼察觉.这种情况发生在人们,例如,复制粘贴文本或碰巧意外按下某些奇怪的键盘组合时.
似乎在项目中允许UTF-8只会带来问题......
3)对于国际化,我最初认为UTF-8是一件好事("如果文件编码不支持所需的字符,你如何添加翻译?").但是,事实证明,Java Resource Bundles(.properties文件)必须使用ISO-8859-1进行编码,否则它们可能会中断.相反,国际字符被转换为\uXXXX
符号,例如\u0009
,文件编码ISO-8859-1
.所以...我们甚至无法使用UTF-8.
对于二进制文件......好吧,编码方案并不重要(我想可以说它甚至不存在).
我们该如何处理这些问题?