Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3596154
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 18, 20262026-05-18T19:56:54+00:00 2026-05-18T19:56:54+00:00

Sorry about the length of this question. I’m new to Java and I’ve come

  • 0

Sorry about the length of this question. I’m new to Java and I’ve come across something that is really stumping me. I’m so new to Java that I don’t even know all the terminology yet, so please bear with me; I have about 3 years of PHP experience (mostly procedural, not OO), but very little Java. I’m also aware that debugging with System.out.println is the Wrong Way to do it, but it works and it’s what I’m used to (insert joke about PHP programmers here if you must). I’m still trying to figure out how to use the NetBeans debugger.

I’m working on adding a feature to a web application that uses Struts (1.x). The problem I’m having seems to be that a method is declared to want a String passed to it, but doing Reflection on that method says it wants String[] (a string array). I’m constrained in that I can’t really make major structural changes to the app, and of course I have to make sure that I don’t break anything in the app that is currently working, so I’m trying to make my changes in the context of what’s already there. So, to the problem…

Here is where the method is declared (many many lines cut from these to show only what I hope are the relevant bits):

AEReportBean.java:

public class AEReportBean {
    private String selectedDownloadFields = null;

    public String getSelectedDownloadFields() {
        return selectedDownloadFields;
    }

    // Note that there is no overloading of this function anywhere, this is the only declaration.
    public void setSelectedDownloadFields(String selectedDownloadFields) {
        this.selectedDownloadFields = selectedDownloadFields;
    }
}

When the user clicks Submit on the form, it gets handled by AEReportSubmitAction.java:

public class AEReportSubmitAction extends BaseAction {
    public ActionForward doExecute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response
        ) throws Exception {
        // This works fine, the paramater is getting passed in the request:
        System.out.println("URL parameter: " + request.getParameter("selectedDownloadFields");

        AEReportBean bean = new AEReportBean(request.getLocale(), 0);

        PropertyUtil.setAllFromRequest(request, bean);
        // This prints "Null", meaning the setAllFromRequest line above is failing to set this property.
        System.out.println("AEReportSubmitAction.java - bean.getSelectedDownloadFields() after setAllFromRequest: " + bean.getSelectedDownloadFields());
    }
}

PropertyUtil.setAllFromRequest() is where the magic, and the real problem, happens:

public class PropertyUtil {
    /**
     * Takes all the parameters from the request object and if there's a matching
     * mutator method in the bean, sets it
     */
    static public void setAllFromRequest(ServletRequest request, Object out) {
        // Iterate through all the request parameter names and try to set each one.
        for (Enumeration parameterNames = request.getParameterNames(); parameterNames.hasMoreElements();) {
            String name = (String) parameterNames.nextElement();
            try {
                PropertyUtil.setSimpleProperty(out, name, request.getParameter(name));
            }
            catch (Exception e) {
                log.info("Exception while setting properties from the Request. parameterName=" + name, e);
            }
        }
    }

    /**
     * Sets the property from an object using the object's mutator method.
     * Assumes naming conventions for accessor methods
     * @param bean the object to get the property from
     * @param property the name of the property to obtain
     * @param newProperty the object to set
     */
    // NOTE: This just seems to be a wrapper for the method below it...
    static public void setSimpleProperty(Object bean, String property, Object newProperty) throws Exception {
        PropertyUtil.setSimpleProperty(bean, property, newProperty, null);
    }

    /**
     * Sets the property from an object using the object's mutator method.
     * Assumes naming conventions for accessor methods
     * @param bean the object to get the property from
     * @param property the name of the property to obtain
     * @param newProperty the object to set
     */
    static public void setSimpleProperty(Object bean, String property, Object newProperty, Class type) throws Exception {
        // Capitalize the first letter in the property and append "set" to the front
        String methodName = "set" + property.substring(0, 1).toUpperCase() + property.substring(1);
        Method method;

        Class[] parameters;

        // If the Type was passed in when this method was called, simply add it to the Class array.
        if (type != null) {
            parameters = new Class[]{type};
        }
        // If the Type was not specified, determine the Type's class by calling getClass() on it; that class will be used below to call the appropriate setter method.
        else {
            parameters = new Class[]{newProperty.getClass()};
        }

        // Here's the reflection problem...
        // Iterate through all the methods in the bean.  If the method is named "setSelectedDownloadFields", print out some info about it.
        for (Method m : bean.getClass().getMethods()) {
            if (m.getName().equals("setSelectedDownloadFields")) {
                // newProperty is the incoming data that ultimately comes from the HTML form field.
                System.out.println("newProperty.getClass(): " + newProperty.getClass()); // Prints "class java.lang.String"

                    // Added for Cameron Skinner in comments.
                    System.out.println("m.toGenericString: " + m.toGenericString()); // Prints "public void com.[company deleted].bean.AEReportBean.setSelectedDownloadFields(java.lang.String[])"

                System.out.println("m.getName(): " + m.getName()); // Prints "setSelectedDownloadFields"
                System.out.println("parameters:");
                for (Class c : m.getParameterTypes()) {
                    System.out.println("--c.getCanonicalName(): " + c.getCanonicalName()); // Prints "java.lang.String[]"
                    System.out.println("--c.getName(): " + c.getName()); // Prints "[Ljava.lang.String;"
                }
            }
        }


        // And here's where it fails...
        try {
            System.out.println("bean.getClass(): " + bean.getClass());  // Prints "class com.[company deleted].bean.AEReportBean"
            System.out.println("methodName: " + methodName); // Prints "setSelectedDownloadFields"
            System.out.println("for (Class p : parameters):");
            for (Class p : parameters) {
                System.out.println("--p.getCanonicalName(): " + p.getCanonicalName()); // Prints "java.lang.String"
            }

            // Here it looks for a method called, effectively, AEReportBean.setSelectedDownloadFields(String s), but above we see that reflection is showing it as AEReportBean.setSelectedDownloadFields(String[] s), so the try block fails.
            method = bean.getClass().getMethod(methodName, parameters);
        }
        catch (NoSuchMethodException e) {
            // All lines below here also fail until it bombs out with the exception at the bottom...

            // If no method can be found, then see if it's a primitive type that
            // has been wrapped
            Class valueClass = newProperty.getClass();
            //System.out.println("valueClass.toString() = " + valueClass.toString());
            try {
                if (valueClass.equals(Integer.class)) {
                    method = bean.getClass().getMethod(methodName, new Class[]{int.class});
                }
                else if (valueClass.equals(Double.class)) {
                    method = bean.getClass().getMethod(methodName, new Class[]{double.class});
                }
                else if (valueClass.equals(Long.class)) {
                    method = bean.getClass().getMethod(methodName, new Class[]{long.class});
                }
                else if (valueClass.equals(Float.class)) {
                    method = bean.getClass().getMethod(methodName, new Class[]{float.class});
                }
                else {
                    throw new Exception(e.getMessage());
                }
            }
            catch (NoSuchMethodException ex) {
                throw new Exception(ex.getMessage());
            }
        }

        // If it had gotten to this point, it would call the method with the appropriate parameters, and the property would be set.
        try {
            // Now execute the method
            method.invoke(bean, new Object[]{newProperty});
        }
        catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }
}

I really don’t know what I’m missing here, but there must be something. Other HTML form elements on the same page work perfectly. Please let me know if any more information is needed. Thanks!

  • 1 1 Answer
  • 2 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-18T19:56:55+00:00Added an answer on May 18, 2026 at 7:56 pm

    The code results doesn’t lie. It’s basically telling that the class isn’t what you expect it to be. You’ve multiple AEReportBean classes of different versions in the classpath of your project, possibly in different packages, and the wrong one has been imported or got precedence in classloading. Do a Type/Class search in Netbeans to find all classes by the given name in the classpath (I don’t do Netbeans, but in Eclispe it’s Ctrl+Shift+T, the Netbeans equivalent is probably Alt+Shift+O).

    Update: another possible cause is that Netbeans didn’t build the project automatically on save of the source file (an IDE should create/refresh .class files during build). Look somewhere in settings.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Sorry about the length of this question. I'm new to Java and I've come
Sorry about the wording of the question, I don't really know how to put
First I am sorry about the length of this post, but I wanted to
Bad wording on the question, sorry about that. Will try to explain what I'm
I am sorry about how simple this question might be, but I cannot find
Sorry about the extremely vague question title (any suggestions for improvements welcome) I have
Sorry about the wording for my question title. I have a basic HTML anchor
sorry about input mistakes, english its not my mother lang. I have this code
sorry about the last question. (I hate google traductor). Im working in a MMO
I'm sorry about the naive question. I have the following: public Array Values {

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.