Struts2 radio UI tag issue.
Hi, Current radiomap.ftl file uses the string representation of map key to determine if the radio button should be checked: <#if tag.contains(parameters.nameValue, itemKeyStr)> As a result, only String type of property can be used for the radio tag. In select.ftl file, it uses the map key itself instead of the string representation of it: <#if tag.contains(parameters.nameValue, itemKey) == true> This makes much sence becuase you can use other types than the String such as type-safe enums for the property type. Is there any problems to use the itemKey instead of the itemKeyStr in radiomap.ftl too? <#if tag.contains(parameters.nameValue, itemKey)> -- Shisei Hanai - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: Struts2 radio UI tag issue.
2006/11/8, tm jee <[EMAIL PROTECTED]>: There's a related jira issue for this as well reported on WebWork. http://jira.opensymphony.com/browse/WW-1369 I don't think there's an issue comparing the key. What do others think about it? But for rendering the page, we should use the string cause freemarker will added locale specific information to numbers for example such that 1234567 might gets rendered as 1,234,567 etc. I think that's the reason the string representation is used. Well, this fix does NOT affect rendering at all. It changes the following three lines: <#if tag.contains(parameters.nameValue, itemKey)> checked="checked"<#rt/> This code is only for determining if the radio tag is checked or not. It will never interfere othere features such as value rendering or i18n. Thanks, -- Shisei Hanai - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Is it possible to configure a request scoped bean of Spring2?
Hi, I'm trying Spring2 with Struts2 but cannot configure request scoped bean. I've changed web.xml along with the folowing guide: http://www.opensymphony.com/webwork/wikidocs/Spring%20Session%20Components%20Workarounds.html requestContextFilter org.springframework.web.filter.RequestContextFilter requestContextFilter /* Then added a request scoped bean in the applicationContext.xml. However, the application fails throwing the following exception. org.springframework.beans.factory.BeanCreationException: Error creat ing bean with name 'userAction' defined in ServletContext resource [/WEB-INF/app licationContext.xml]: Cannot resolve reference to bean 'userDao' while setting b ean property 'userDao'; nested exception is org.springframework.beans.factory.Be anCreationException: Error creating bean with name 'userDao': Scope 'request' is not active; nested exception is java.lang.IllegalStateException: No thread-boun d request: use RequestContextFilter Any idea? -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: Is it possible to configure a request scoped bean of Spring2?
Thanks! It works fine! 2006/11/12, tm jee <[EMAIL PROTECTED]>: Hi Ruimo, If not mistaken i think we might need this ... ... rgds Ruimo Uno <[EMAIL PROTECTED]> wrote: Hi, I'm trying Spring2 with Struts2 but cannot configure request scoped bean. I've changed web.xml along with the folowing guide: http://www.opensymphony.com/webwork/wikidocs/Spring%20Session%20Components%20Workarounds.html requestContextFilter org.springframework.web.filter.RequestContextFilter requestContextFilter /* Then added a request scoped bean in the applicationContext.xml. init-method="init" destroy-method="terminate" scope="request"> However, the application fails throwing the following exception. org.springframework.beans.factory.BeanCreationException: Error creat ing bean with name 'userAction' defined in ServletContext resource [/WEB-INF/app licationContext.xml]: Cannot resolve reference to bean 'userDao' while setting b ean property 'userDao'; nested exception is org.springframework.beans.factory.Be anCreationException: Error creating bean with name 'userDao': Scope 'request' is not active; nested exception is java.lang.IllegalStateException: No thread-boun d request: use RequestContextFilter Any idea? -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------- Now you can scan emails quickly with a reading pane. Get the new Yahoo! Mail. -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
'&' is encoded even if the encode attribute of the url tag is set to false.
Hi, If the url tag is used to generate an URL for the form tag: The generated HTML form tag becomes as following:
Exception thrown in OGNL evaluation.
Hi, I have submitted this to user list a few hours ago but finally, I found the root cause of this issue. So, here I report it to dev list. If an exception is thrown while OGNL expression evaluation such as in the following scenario: XXXAction public String getMessage() { throw new NullPointerException(); } XXX.jsp The exception is wrapped in an OgnlException and re-thrown. It is caught in com.opensymphony.xwork2.util.CompoundRootAccessor.getProperty() and wrapped in a XWorkException() and re-thrown. } catch (OgnlException e) { if (e.getReason() != null) { final String msg = "Caught an Ognl exception while getting property " + name; throw new XWorkException(msg, e); } } catch (IntrospectionException e) { Finally, it is caught in com.opensymphony.xwork2.util.OgnlValueStack.findValue(String, Class) and swallowed. } catch (Exception e) { logLookupFailure(expr, e); return findInContext(expr); } finally { As a result, the upper layer does not receive any exception. So, no exception handler is invoked even if it is registered. Moreover, in 'open session in view' pattern, since the upper layer are not notified any error, the transaction is wrongly committed and it causes serious problem. I tried to add a catch clause for RuntimeException: } catch (RuntimeException e) { logLookupFailure(expr, e); throw e; } catch (Exception e) { logLookupFailure(expr, e); return findInContext(expr); } finally { Yes, the exception is successfully thrown to the upper layer with this code change. However, Struts shows 'java.io.IOException: Stream closed:' on the browser. This message seems a bit confusing. and difficult to realize what is actually happening (NPE is thrown). Does anybody have better solution on this? Thanks, -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: Exception thrown in OGNL evaluation.
Hi, thanks for your comment. 2007/8/17, Rene Gielen <[EMAIL PROTECTED]>: > It's no bug, it's a feature... > > The policy for model access (e.g. property calls) via expression > evaluation is fail silent. It would cause tons of exceptions if ognl > expression evaluation / property access would not swallow them. I feel it is overkill. The property getters in action classes may throw RuntimeException because of programming bugs. Even in this case, the current implementation just ignore the exception and the shown page will be just corrupted. We cannot show user friendly 'sorry page' because the Struts exception handler cannot get exception. > Most likely, you are doing business logic calls in your model access > domain and you should think of moving any call with the possibility to get > service relevant exceptions to the described business logic domain access > methods. No, it is not 'business logc'. In 'open session in view' pattern, the db transaction is kept open until the view rendering finishies. If you call the property access method of the acction class, it calls the getter method of tne entity class. It triggers O/R mapping layer invocation and lazily accesses the database. As a result, some kind of system exception (such as SQLException) may be thrown while view rendering. > Am Do, 16.08.2007, 17:01, schrieb Ruimo Uno: > > Hi, > > > > I have submitted this to user list a few hours ago but finally, I > > found the root cause of this issue. So, here I report it to dev list. > > If an exception is thrown while OGNL expression evaluation such as in > > the following scenario: > > > > XXXAction > > public String getMessage() { > > throw new NullPointerException(); > > } > > > > XXX.jsp > > > > > > The exception is wrapped in an OgnlException and re-thrown. It is > > caught in com.opensymphony.xwork2.util.CompoundRootAccessor.getProperty() > > and wrapped in a XWorkException() and re-thrown. > > > > } catch (OgnlException e) { > > if (e.getReason() != null) { > > final String msg = "Caught an Ognl exception while getting > > property " + name; > > throw new XWorkException(msg, e); > > } > > } catch (IntrospectionException e) { > > > > Finally, it is caught in > > com.opensymphony.xwork2.util.OgnlValueStack.findValue(String, Class) > > and swallowed. > > > > } catch (Exception e) { > > logLookupFailure(expr, e); > > > > return findInContext(expr); > > } finally { > > > > As a result, the upper layer does not receive any exception. So, no > > exception handler is invoked even if it is registered. Moreover, in > > 'open session in view' pattern, since the upper layer are not notified > > any error, the transaction is wrongly committed and it causes serious > > problem. > > > > I tried to add a catch clause for RuntimeException: > > > > } catch (RuntimeException e) { > > logLookupFailure(expr, e); > > throw e; > > } catch (Exception e) { > > logLookupFailure(expr, e); > > > > return findInContext(expr); > > } finally { > > > > Yes, the exception is successfully thrown to the upper layer with this > > code change. However, Struts shows 'java.io.IOException: Stream > > closed:' on the browser. This message seems a bit confusing. and > > difficult to realize what is actually happening (NPE is thrown). Does > > anybody have better solution on this? > > > > Thanks, > > > > -- > > Ruimo Uno > > (Shisei Hanai) > > > > - > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > -- > Rene Gielen | http://it-neering.net/ > Aachen | PGP-ID: BECB785A > Germany | gielen at it-neering.net > > > - > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: Exception thrown in OGNL evaluation.
Rane, 2007/8/17, Rene Gielen <[EMAIL PROTECTED]>: > Ruimo, > > see below > > Ruimo Uno schrieb: > > Hi, thanks for your comment. > > > > 2007/8/17, Rene Gielen <[EMAIL PROTECTED]>: > >> It's no bug, it's a feature... > >> > >> The policy for model access (e.g. property calls) via expression > >> evaluation is fail silent. It would cause tons of exceptions if ognl > >> expression evaluation / property access would not swallow them. > > > > I feel it is overkill. The property getters in action classes may > > throw RuntimeException because of programming bugs. Even in this case, > > the current implementation just ignore the exception and the shown > > page will be just corrupted. We cannot show user friendly 'sorry page' > > because the Struts exception handler cannot get exception. > > > > You would not be able to use the most common use patterns without having > to do exepction handling on the JSP page then! Think of a model object > foo with a getter getFoo() in your a FooCrudAction. You have an > editFoo.jsp. If you want to create a new foo entry, the sequence would be > - invoke edit/create action, triggering execute() in FooCrudAction > - render editFoo.jsp > - submit form > - invoke save action, triggering save() in FooCrudAction > - on success, render editFoo.jsp > > if ognl would not swallow the exceptions, then placing simple tag like > > would fail with NPE in first rendering if you did not provide a > (unnecessary) this.foo=new Foo() in your execute() method, or a lazy > getter. Just a simple example. But if you would change this behaviour, > the showcase app code would need approximately an additional 10-15% more > code just for doing unneeded initializations and exception handling. You won't get NPE in this scenario. Ognl automatically create instance for you. I believe you know about this feature. > What if the execption is thrown? It will be thrown within JSP page > handling, and swallowed there! Your OpenSessionInView Interceptor or any > higher level layer would take no notice of the exception. Instead you > would have to use the anti-pattern of exception handliing with in JSP > code to present useful information. In the API specification for PageContext.handleException() states the following: --- If no error page is defined in the page, the exception should be rethrown so that the standard servlet error handling takes over. --- If my understanding is correct, the exception should be rethrown and the servlet layer can handle it. > >> Most likely, you are doing business logic calls in your model access > >> domain and you should think of moving any call with the possibility to get > >> service relevant exceptions to the described business logic domain access > >> methods. > > > > No, it is not 'business logc'. In 'open session in view' pattern, the > > db transaction is kept open until the view rendering finishies. If you > > call the property access method of the acction class, it calls the > > getter method of tne entity class. It triggers O/R mapping layer > > invocation and lazily accesses the database. As a result, some kind of > > system exception (such as SQLException) may be thrown while view > > rendering. > > > > This pattern is widely used, I'm using it myself in many applications. > But where do you expect the exception? If you make sure that you have a > foo object loaded from persistence layer, the the foo.getBars() call to > a a lazy initialized collection of referenced objects should never fail > due to _runtime_ problems you have to deal with. If, for example, for > some reason your session is closed, you have to look for a design time > problem - most commonly people forget about holding the session open > (luckily we have OpenSessionInView). Closing the session should be fixed as a design bug. I agree with you at this point. But in this case, the system should show an user friendly 'sorry page' so that the user can perform appropriate action. As we cannot take all bugs out of our system, need a sfety net. If there is a network problem between ap server and db server, lazy loading will fail by system error. > The best practice pattern for a displaying a foo object looks like this: > > - invoke showFoo.action?id=1 > - prepare() method of your action: this.foo = fooService.getById(this.id) > - handle any exception you like, or let it pop to the upper layers > - on success, render showFoo.jsp > - iterate over foo.bars in view - will be lazy initialized, but should > not throw any exception is your design was proper My previous example may be poor to explain this iss
Re: Exception thrown in OGNL evaluation.
Hi, Rene, 2007/8/17, Rene Gielen <[EMAIL PROTECTED]>: > > You won't get NPE in this scenario. Ognl automatically create instance > > for you. I believe you know about this feature. > > > > Not when trying to read the property, only when applying values. The first > invocation with null foo object will cause OGNL to try to read the > property of the foo.name property and fail silently - no object will be > created. This will happen when then parameters interceptor tries to apply > values to the model (when invoking the save view) Hmm, I am not sure I fully understand what you mean but I also talking about applying the http request parameters into the model object. The automatic instance creation is done inside the OGNL and the code chage that I proposed in my first mail is not for OGNL but for XWork. You can still happily use this convenient feature even with my code change. > > Closing the session should be fixed as a design bug. I agree with you > > at this point. But in this case, the system should show an user > > friendly 'sorry page' so that the user can perform appropriate action. > > As we cannot take all bugs out of our system, need a sfety net. If > > there is a network problem between ap server and db server, lazy > > loading will fail by system error. > > but how could the fooService.getById(this.id), executed by the prepare or > action method succeed and the lazy reference getter fail just a few > millies later, when the session is still open??? Yes, it should be a rare case but there IS a possibility and also there may be bugs around there and they may throw the RuntimeException, such as NPE. > Yes, but your display logic should not handle errors coming from business > logic. That should always be done in the controller stack (action / > interceptors), or even underlying layers if apply. This simply means > moving error prone calls of the underlying layers to the controller, not > the view. While JPA / Hibernate gives you the opportunity of doing lazy > fetching of references (which is good, but very unique to ORM, but not to > other service providers), it is not always the best pattern have the > _view_ initialize the fetches you _know_ you will need... I understand your design preference. It is sometimes preferable to take easier design pattern such as dto pattern that never access db while view rendering. The code may become a bit more redundant but it should simplify the problem determination. But I still wonder why XWork swallows the system error/runtime excpetion if there is no meanig to do so. As I stated above, the automatic instance creation won't be destroyed. Any other concers to rethrow the system error/runtime exception to the upper layer? -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
token-session does not work.
Hi, I found the token-session interceptor does not work. IE 6.0 Jetty-6.1.3 or Tomcat 6.0.14 You need to use IE but Firefox to evaluate this issue since FIrefox itself seems to prevent submitting the same request more than once. --- Action class --- public String execute() { System.err.println("*** execute() ***"); try {Thread.sleep(3000);} catch (InterruptedException ex) {} ... --- jsp --- --- struts.xml --- hello.jsp You will get white screen if you hit the submit button more than once. I digged into the Struts source code and found that the result in the following line is null: --- TokenSessionStoreInterceptor.java --- protected String handleInvalidToken(ActionInvocation invocation) throws Exception { ... Result result = savedInvocation.getResult(); If the user hit the submit button more than once, the handleInvalidToken method is called. If the action invoked by the first submit is completed and there is a result already, this result variable becomes non-null and everything goes well. I confirmed it by using debugger to place break point at this line and wait 3 seconds before proceeding. But if the action invoked by the first action is not completed yet, the result variable becomes null and the subsequent requests result in a blank, I mean the user get white out browser screen if he or she hits the submit button more than once. It should wait until the result becomes non-null value. But I don't know how to do that but just polling like this: Result result = null; while (true) { result = savedInvocation.getResult(); if (result != null) break; try {Thread.sleep(100);} catch (InterruptedException ex) {} } It is not smart at all and I am looking for more appropriate way. Any suggestions? -- Ruimo Uno (Shisei Hanai) - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]