我在我的Web应用程序中使用EclipseLink,我很难优雅地捕获和处理它生成的异常.我从这个线程看到似乎是一个类似的问题,但我没有看到如何解决或修复它.
我的代码看起来像这样:
public void persist(Category category) {
try {
utx.begin();
em.persist(category);
utx.commit();
} catch (RollbackException ex) {
// Log something
} catch (HeuristicMixedException ex) {
// Log something
} catch (HeuristicRollbackException ex) {
// Log something
} catch (SecurityException ex) {
// Log something
} catch (IllegalStateException ex) {
// Log something
} catch (NotSupportedException ex) {
// Log something
} catch (SystemException ex) {
// Log something
}
}
Run Code Online (Sandbox Code Playgroud)
当使用违反唯一性约束的实体调用persist()时,我会收到容器捕获和记录的异常爆炸.
Exception [EclipseLink-4002] (Eclipse Persistence Services …Run Code Online (Sandbox Code Playgroud) 我想创建一个具有不需要值的属性的组件.例如,而不是像这样的东西:(我现在有)
<app-document [mode]="'edit'" ... ></app-document>
Run Code Online (Sandbox Code Playgroud)
要么
<app-document [editMode]="true" ... ></app-document>
Run Code Online (Sandbox Code Playgroud)
我宁愿:
<app-document editMode ...></app-document>
Run Code Online (Sandbox Code Playgroud)
因此组件本身必须查看属性editMode是否存在.当我有很多这样的属性时,这看起来会更清晰.我还没有看到有关如何执行此操作的任何文档.它可行吗?
我刚刚开始使用Netbeans 7.1测试版,它正在调出我以前从未见过的类型的错误.特别:
A managed bean with a public field should not declare any scope other than @Dependent.
它抱怨的领域是public static final.我可以理解对非静态字段的限制,但我想不出一个很好的理由不允许静态字段.不幸的是我使用了很多,因为我不喜欢在我的代码中使用常量.
我注意到即使我在编辑器的边缘得到红点,maven驱动的构建仍然有效,GlassFish仍然以我期望的方式运行我的应用程序.
那么我对这个问题的看法是什么?我是否必须在其他地方移动我的静态字段,还是有其他方法来处理它?
我刚刚在最新的Netbeans中开始了一个新项目,我注意到它已经开始给我这样的代码的代码建议:
if (a == null) x = 0;
else x = 1;
Run Code Online (Sandbox Code Playgroud)
它说
If-Else Statements MUST use Braces
Run Code Online (Sandbox Code Playgroud)
它想"修复"它:
if (a == null) {
x = 0;
}
else {
x = 1;
}
Run Code Online (Sandbox Code Playgroud)
这根本不是我想要的.我特别关注这一点,它使代码看起来不必要地混乱.我有成千上万行代码不使用(显然不需要)额外的大括号.假设Netbeans做对了,这个要求何时发生,是什么驱使它?
PS我知道我可以关掉这些消息.
更新问题:
我写这篇文章的方式可能并不明显,但根据@ corsiKa的评论,我可能会澄清一下.我真的不想讨论花括号是否适合.我想知道他们是否有必要.
编写和制作Netbeans的男孩和女孩通常很好地插入社区,以及Java正在采取什么方向或预期的方向.所以我认为有可能当他们使用咨询机制给我们提醒java语法将要改变时,我正在使用的代码实践将在某个时候被弃用.
从下面saber_raider的回答看来,答案是否定的.看来,Netbeans的咨询与字夸大MUST作为神秘建议.
这个问题与前一个关于编写会话超时处理程序的问题有关.
该线程的答案涉及从servlet访问各种会话范围的托管bean.建议(如看到这里)是这样做的过滤器:
HttpSession session = request.getSession(false);
User user = (session != null) ? (User) session.getAttribute("user") : null;
Run Code Online (Sandbox Code Playgroud)
据推测,这会获取User类的会话bean .问题是这不起作用.
出了什么问题,bean在会话属性中存在,但它们由Weld工具包装.我写了doFilter()方法如下:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String sp = req.getServletPath();
System.out.println("------------------------");
System.out.println("doFilter(): " + sp);
if (!sp.startsWith("/javax")) { // eliminates many requests
HttpSession session = req.getSession();
Enumeration<String> en = session.getAttributeNames();
int count = 0;
while (en.hasMoreElements()) …Run Code Online (Sandbox Code Playgroud) 我找不到任何规范文本来回答这个问题。我一直在使用这种代码模式(这是在 Angular 应用程序中的 TypeScript 中):
observeSomethingFun$: Observable<Fun>;
...
async loadsOfFun() {
const fun = await this.observeSomethingFun$.toPromise();
// I now have fun
}
Run Code Online (Sandbox Code Playgroud)
一般来说,Observables 需要取消订阅。async使用Angular管道时会自动发生这种情况,但在这种情况下会发生什么?toPromise发出一个值后是否取消订阅?
如果没有,我如何手动取消订阅?
更新:
事实证明@Will Taylor 下面的回答是正确的,但我的问题需要澄清一下。
在我的例子中,Observable 发出一个永无止境的流,这与 Angular 的HttpClient Observables 不同,它在发出一个值后完成。因此,在我的情况下,await根据泰勒的回答,我永远不会通过声明。
RxJS 使这个问题很容易解决。正确的说法是:
const fun = await this.observeSomethingFun$.pipe(first()).toPromise();
Run Code Online (Sandbox Code Playgroud)
RxJSfirst操作符将接收第一个值并取消订阅源 Observable。然后它会将该值发送给toPromise操作员,然后完成。
我正在编写一个需要与我的DAO交互的(复合)组件.以下是声明Java部分的方式:
@FacesComponent(value="selectLocation")
public class SelectLocation extends UINamingContainer {
Run Code Online (Sandbox Code Playgroud)
为了获取DAO对象,我尝试了CDI注释:
@Inject private LocationControl lc;
Run Code Online (Sandbox Code Playgroud)
这没用,所以我尝试了Faces注释:
@ManagedProperty (value = "@{locationControl}") private LocationControl lc;
Run Code Online (Sandbox Code Playgroud)
两种情况都没有发生 - 属性lc在构造函数完成后最终为null.
我在所有的后台bean中使用CDI,一切正常.这将使用GlassFish 3.1.1中的Weld.有关如何获取资源的任何建议?
我正在使用p:dataTable(PrimeFaces)渲染一个表,我想要做的是根据内容的值为单元格的背景着色.这与着色行或列不同 - 它是单个单元格.
首先是一个CSS问题.如果我这样做:
<p:column headerText="xyzzy">
<div style="background-color: green">
<h:outputText value="#{rowVar.anumber}" >
<f:convertNumber groupingUsed="true" />
</h:outputText>
</div>
</p:column>
Run Code Online (Sandbox Code Playgroud)
仅设置内容的背景颜色,而不是整个单元格.换句话说,填充仍然是默认值.
其次,我想使样式字符串成为变量表达式.我可以向辅助bean添加一个函数,但是如何访问方法中的表内容?这会有用吗?
<div style="#{bean.computeCSS(rowVar.number}">
Run Code Online (Sandbox Code Playgroud)
编辑:
我找到了一种方法来完成条件部分,但我仍然需要CSS部分的帮助.我的解决方案如下:
<p:column headerText="xyzzy">
<div class="#{rowVar.anumber gt 0 ? 'colored' : ''}">
<h:outputText value="#{rowVar.anumber}">
<f:convertNumber groupingUsed="true" />
</h:outputText>
</div>
</p:column>
Run Code Online (Sandbox Code Playgroud)
虽然我不喜欢在EL中使用,但这样做的好处是不需要支持bean方法.
但是我仍然只获得背景颜色,而不是整个细胞.
我的Angular组件倾向于具有全局状态(或“模式”),因此我正在寻找一种有效地对此进行编码的方法。我试图做的是这样的:
@Component({
....
})
export class AbcComponent implements OnInit {
enum State {
init, view, edit, create, wait
}
state: State = State.init;
Run Code Online (Sandbox Code Playgroud)
这个想法是,AbcComponent内部的函数可以简单地通过设置state属性来驱动模板的操作。例如:
<div class="col" *ngIf="state === State.view"> ... </div>
Run Code Online (Sandbox Code Playgroud)
问题是枚举定义不能出现在类结构内。然后,如果我将其移动到类结构之外,则模板不会在其本地范围内。
有正确/更好的方法吗?
PS:如果我一直在做的事情是,我有几个布尔属性,每个状态一个。例如modeInit modeView等。它的工作原理,但它是笨拙的,因为只有一个应该是真正的在同一时间。
要访问当前 URL 路径中的组件,在我的应用程序中执行以下操作:
constructor(private route: ActivatedRoute) { }
...
load() {
this.route.params.subscribe((params) => {
const id = +params['id'];
console.log('got parameter', id);
... etc
Run Code Online (Sandbox Code Playgroud)
这是教科书案例,变量id设置为广告。但我想使用更优雅的await形式,但它不起作用。(当然,后面会有一串await语句。)像这样:
async load() {
try {
console.log('getting parameters');
const params = await this.route.params.toPromise();
console.log('got params', params);
const id = +params['id'];
... etc
Run Code Online (Sandbox Code Playgroud)
我得到的是第一个console.log()调用的输出,但第二个从未出现。当然,id变量没有设置,其余的代码永远不会执行。
文档和工作代码说this.route.params是一个Observable,它应该可以通过toPromise()转换为Promise,从而与 Typescript async / await 一起使用。我对来自HttpClient模块的Observable使用await语句就好了。
但它不起作用。有谁知道为什么?
jsf-2 ×4
angular ×3
cdi ×3
netbeans ×2
rxjs ×2
typescript ×2
eclipselink ×1
java ×1
javascript ×1
jpa ×1
jpa-2.0 ×1
jsf ×1
netbeans-7 ×1
primefaces ×1