I solved this problem and I figure that nabble might want to record the end reason for the bug.
Another method entirely, elsewhere on ProductDetailAction, had a @Transactional annotation. It didn't need one -- I was using injected transaction management and the OpenEntityManagerInViewFilter. Why the error message below was generated, instead of "hey dummy, don't use @Transactional in this context," is beyond me, but at least it's fixed. jk On Wed, Apr 30, 2008 at 3:47 PM, Jim Kiley <[EMAIL PROTECTED]> wrote: > Hi folks, > > I've run into a problem with Struts 2 validation annotations. > > In short -- I have a VisitorFieldValidator on an action POJO named > ProductDetailAction. I have RequiredFieldValidator and > RequiredStringValidator on one field within the "visited" object. > > Now -- ProductDetailAction did not (originally) inherit from > ActionSupport. I could see validation errors cropping up in my log, but my > save() method was still executing, because , as I understand it, without > ActionSupport (or ValidationAware) there was no way for Struts to redirect > my action back to my input() method when it found a validation error. > > If I change the hierarchy so that ProductDetailAction DOES inherit, > indirectly, from ActionSupport, I can't even get to my input() method -- my > productDetail JSP doesn't render. Instead I get the following exception: > > java.lang.IllegalArgumentException: The input() is not defined in action > class $Proxy99 > at > com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:412) > at > com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267) > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229) > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:88) > (...) > > I get the same exception if I simply implement ValidationAware in the same > way that ActionSupport does. > > I'm including relevant snippets of ProductDetailAction, Product, and > struts.xml below. Does anyone have any insight as to why this might be > happening? I'm stumped, and so are my coworkers. Thanks. > > Jim > > ----- > ProductDetailAction.java > ----- > @Validation > public class ProductDetailAction extends FormularyDetailAction { // note: > FormularyDetailAction extends ActionSupport > // snippery > > @Override > @SkipValidation > public String input() throws Exception { > if(id==null || id < 1) { > this.product = new Product(); > } else { > this.product = formularyBso.fetchProduct(this.id); > } > return Action.INPUT; > } > > @VisitorFieldValidator(message="") > public Product getProduct() { > return product; > } > // snippery > } > ----- > Product.java > ----- > @Entity > @Table(name="myrespironics.p_product_versions") > @Validation > public class Product extends FormularyProduct { > //snip > @RequiredFieldValidator(message="Please enter a value.") > @RequiredStringValidator(message="Please enter a value.") > public String getName() { > return name; > } > //snip > } > ----- > struts.xml > ----- > <struts> > <package name="user" extends="struts-default"> > <interceptors> > <interceptor-stack name="myInterceptors"> > <interceptor-ref name="exception"/> > <interceptor-ref name="alias"/> > <interceptor-ref name="params"/> > <interceptor-ref name="servletConfig"/> > <interceptor-ref name="prepare" /> > <interceptor-ref name="i18n"/> > <interceptor-ref name="chain"/> > <interceptor-ref name="modelDriven"/> > <interceptor-ref name="fileUpload"/> > <interceptor-ref name="checkbox"/> > <interceptor-ref name="staticParams"/> > <interceptor-ref name="params"/> > <interceptor-ref name="conversionError"/> > <interceptor-ref name="validation"> > <param name="excludeMethods">input,back,cancel</param> > </interceptor-ref> > <interceptor-ref name="workflow"> > <param name="excludeMethods">input,back,cancel</param> > </interceptor-ref> > </interceptor-stack> > </interceptors> > > <default-interceptor-ref name="myInterceptors"/> > <global-results> > <result name="error">/error.jsp</result> > </global-results> > > <action name="productDetail" class="productDetailAction" > method="input"> > <result name="success" > type="redirect-action">productList</result> > <result > name="input">/WEB-INF/secure/formulary/productDetail.jsp</result> > <result name="success-subcategory" type="redirect-action"> > <param name="actionName">subcategoryDetail</param> > <param name="parse">true</param> > <param name="id">${subcategoryId}</param> > </result> > </action> > > </package> > </struts> > -- > Jim Kiley > Technical Consultant | Summa > [p] 412.258.3346 [m] 412.445.1729 > http://www.summa-tech.com -- Jim Kiley Technical Consultant | Summa [p] 412.258.3346 [m] 412.445.1729 http://www.summa-tech.com