【问题标题】:How to pass Dynamic array to server in SOAP based webservice如何在基于 SOAP 的 Web 服务中将动态数组传递给服务器
【发布时间】:2011-08-02 23:10:16
【问题描述】:

我陷入了这个可怕的问题,我有一个用 Java 实现的基于 SOAP 的 Web 服务。除了其他数据之外,客户端应该有“男性”和“女性”复选框,因此用户可以选择其中一个或同时选择两者,然后客户端应该将它发送到服务器以存储在数据库中,它是一个多值实体,但它给了我错误 500,服务器端的失败,是我传递数组然后使用它的方式在服务器端正确吗?如果不是,我怎么能通过和处理它?这是客户的代码,提前感谢您的时间:

private void salvaActionPerformed(java.awt.event.ActionEvent evt) {                                      
    // TODO add your handling code here:
    disease=malattia.getText();


    sexarra=new String[sexint];
    if(sexint==1)
        sexarra[0]=sexone;
    else if(sexint==0)
        JOptionPane.showMessageDialog(null, "Bisogna specificare almeno un valore del campo sesso", "Errore", JOptionPane.ERROR_MESSAGE);
    else{
        sexarra[0]=sexone;
        sexarra[1]=sextwo;}
        // System.out.print(sexarra[0]);
        //     System.out.println(sexarra[1]);



        description=descrizione.getText();


        agestr=eta.getText();
        if(agestr.equalsIgnoreCase(""))
            JOptionPane.showMessageDialog(null, "Il campo età non può essere vuoto", "Errore", JOptionPane.ERROR_MESSAGE);

        age=Integer.parseInt(agestr);
        if( age<=0 || age>=110){

            JOptionPane.showMessageDialog(null, "Il valore inserito nel campo età non è giusto", "Errore", JOptionPane.ERROR_MESSAGE);
        }
        else{

            try {
                URL url = new URL("http://localhost:8080/soap/servlet/rpcrouter");
                //costruzione della chiamata
                Call chiamata = new Call();
                chiamata.setTargetObjectURI("urn:ServerNeuro");
                chiamata.setMethodName("aggiungi_malattia");
                chiamata.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

                SOAPMappingRegistry smr = new SOAPMappingRegistry();
                StringDeserializer sd = new StringDeserializer ();
                smr.mapTypes (Constants.NS_URI_SOAP_ENC, new QName ("", "return"), null, null, sd);
                chiamata.setSOAPMappingRegistry(smr);


                //creazione dei parametri

                Vector parametri = new Vector();
                parametri.addElement(new Parameter("malattia", String.class, disease, null));
                parametri.addElement(new Parameter("eta", Integer.class, age, null));
                parametri.addElement(new Parameter("descrizione", String.class, description, null));
                parametri.addElement(new Parameter("sexarra",String[].class, sexarra, null));

                chiamata.setParams(parametri);
                try {
                    Response risp = chiamata.invoke(url, "");
                    if (risp.generatedFault()) {
                        Fault fault = risp.getFault();
                        System.err.println("Chimata Fallita");
                        System.err.println("Code: " + fault.getFaultCode());
                        System.err.println("descrizione: " + fault.getFaultString());
                    } else {
                        Parameter par = risp.getReturnValue();
                        msg = (String) par.getValue();
                        System.out.print(msg);
                    }
                } catch (SOAPException e) {
                    System.out.println("Errore causata da: (" + e.getFaultCode() + ") :" + e.getMessage());
                    msg = "errore";
                }

            } catch (MalformedURLException ex) {
                System.out.println("Exception: " + ex.getMessage());
            }
            System.out.println(msg);
            if (msg.equals("si")) {
                JOptionPane.showMessageDialog(null, "La registrazione è avvenuta con successo", "REGISTRAZIONE", JOptionPane.INFORMATION_MESSAGE);

            }
            else{


                JOptionPane.showMessageDialog(null, "Attenzione il utente inserito è gia esistente nel database", "ATTENZIONE", JOptionPane.ERROR_MESSAGE);
            }
        }
}                                     

private void femminaActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // TODO add your handling code here:

    if(femmina.isSelected()){
        if(sexint==0){
            sexint++;
            sexone=femmina.getText();

        }

        else if(sexint==1){
            sexint++;

            sextwo=femmina.getText();
        }
        else
            sexint--;

        System.out.println(sexint);
    }
}                                       

private void maschioActionPerformed(java.awt.event.ActionEvent evt) {                                        
    if(maschio.isSelected()){
        if(sexint==0){
            sexint++;
            sexone=maschio.getText();

        }

        else if(sexint==1){
            sexint++;

            sextwo=maschio.getText();
        }
        else
            sexint--;

        System.out.println(sexint);
    }
}  

这是服务器代码:

public String aggiungi_malattia(String malattia, Integer eta,String descrizione,String[] sexarra) {
    String ris = "no";
    String q = null, w = null;
    String errore = connetti();
    //inserimeto dei dati del utente dentro la tabella login
    if(sexarra.length == 2){
        q = "INSERT INTO malattia (nome, eta, descrizione, sesso) "
            + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" + sexarra[0] + "')";}
    else{
        q = "INSERT INTO malattia (nome, eta, descrizione, sesso) "
            + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" + sexarra[0] + "')";
        w="INSERT INTO malattia (nome, eta, descrizione, sesso) "
            + "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" + sexarra[1] + "')";
    }

    if (errore.equals("")) {
        try {
            Statement st = conn.createStatement();
            if(sexarra.lenght == 2){
                st.executeUpdate(q);
                st.executeUpdate(w);
            }
            else
                st.executeUpdate(q);
            st.close();
            conn.close();
            ris = "si";
        } catch (SQLException e) {
            System.out.println("Errore: " + e.getMessage());
            return ris;
        }
    }   
    return ris;
}

这是 Catalina.out 的最后几行,它对我没有任何意义。我怀疑 Array 可能会导致它,因为它是在运行时确定的,我找不到任何其他方法来做到这一点,这里的提示将不胜感激

    Jul 20, 2011 11:35:22 PM org.apache.catalina.realm.CombinedRealm startInternal
    SEVERE: Failed to start "org.apache.catalina.realm.UserDatabaseRealm/1.0" realm
    org.apache.catalina.LifecycleException: No UserDatabase component found under key UserDatabase
        at org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:264)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:201)
        at org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1026)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
    Jul 20, 2011 11:35:22 PM org.apache.catalina.startup.HostConfig deployWAR
    INFO: Deploying web application archive soap.war
    Jul 20, 2011 11:35:23 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory manager
    Jul 20, 2011 11:35:23 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory examples
    Jul 20, 2011 11:35:24 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory ROOT
    Jul 20, 2011 11:35:24 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory host-manager
    Jul 20, 2011 11:35:25 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory docs
    Jul 20, 2011 11:35:25 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory axis
    - Unable to find config file.  Creating new servlet engine config file: /WEB-INF/server-config.wsdd
    Jul 20, 2011 11:35:26 PM org.apache.coyote.AbstractProtocolHandler start
    INFO: Starting ProtocolHandler ["http-bio-8080"]
    Jul 20, 2011 11:35:26 PM org.apache.coyote.AbstractProtocolHandler start
    INFO: Starting ProtocolHandler ["ajp-bio-8009"]
    Jul 20, 2011 11:35:26 PM org.apache.catalina.startup.Catalina start
    INFO: Server startup in 3780 

不幸的是,即使在更改了我认为可能会引发 NPE 的代码之后,它仍然没有改变任何东西。我从 if(sexarra[1]==null){....}

到 if(sexarra.lenght == 2){...}

我收到以下错误:

      Errore causata da: (SOAP-ENV:Protocol) :Unsupported response content type "text/html; charset=utf-8", must be: "text/xml". Response was:

Apache Tomcat/7.0.14 - 错误报告

HTTP 状态 500 -

类型异常报告

消息

描述服务器遇到了一个内部错误 () 阻止它完成这个请求。

异常

javax.servlet.ServletException:错误构建响应信封:java.lang.NullPointerException
        org.apache.soap.server.http.RPCRouterServlet.doPost(RPCRouterServlet.java:418)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note Apache Tomcat/7.0.14 日志中提供了根本原因的完整堆栈跟踪。

【问题讨论】:

  • 您是否调试过代码以查看 RPCRouterServlet.java:418 发生了什么?您是否更改了 Tomcat 的任何默认设置?您是否对每个组件进行了单元测试?
  • 我已经调试了客户端代码,服务器响应后立即抛出异常。我无法调试服务器端代码,它不包含main方法和客户端代码调用它。我没有更改任何 Tomcat 默认设置,它的其他功能运行良好。我认为问题在于动态数组 sexarra 是如何在客户端初始化或如何在服务器端处理的。您认为服务器端的数组处理是否正确?

标签: java mysql web-services soap


【解决方案1】:

我不确定我是否理解您为什么要手动构建 SOAP 请求而不使用某种自动 WSDL-to-class 生成器,它是 JDK、Eclipse 或 NetBeans 附带的。这将为您提供类型/结构安全性,但我肯定会在您的代码中看到问题,例如

if(sexarra[1]== null) { ... }

可能会抛出NPEArrayIndexOutOfBoundsException。不幸的是,Tomcat的输出对我来说也没有意义,至少对你的问题没有意义。

【讨论】:

  • 正是它正在抛出 NPE,给我一个 500 内部服务器错误。我正在使用 NetBeans,但从未听说过 WSDL-to-class 生成器,我一定会研究它。实际上,我应该向老师解释我写的所有代码,因为它是一个大学项目。有什么问题用我的代码,你能解释一下吗?再次感谢!
  • 好吧,您应该始终保持保守并检查您的输入。在这种情况下,您直接访问sexarra 的第二个元素,而不检查数组对象本身是null 还是sexarra.length &gt;= 2。如果您有现成的 WSDL,then this should help
  • 实际上我应该稍后从 Java 类创建 WSDL,所以不幸的是,第二个选项不起作用......
  • 那么您应该研究 JAX-WS 以及长期以来作为 JDK 6 一部分的标准 @WebService@WebMethod 注释。这使用“代码优先”方法,您可以在代码中使用注释设计 Web 服务,然后自动生成 WSDL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多