As per the comments on the bug, I've signed up to post here instead of on the 
bug...


I get this too,  I'm not sure what "full configuration" actually means in this 
context, but there's nothing private in the source, I'd happily include the 
setup.

I'm using xfire 1.2.2, java 5.

What I'm doing is generating a java service from a wsdl.  The wsdl input 
message has an unbounded string, like so....

                        <xsd:complexType name="MailAnyStringRequest">
                                <xsd:sequence>
                                        <xsd:element name="EmailAddresses" 
type="xsd:string" maxOccurs="unbounded"/>
                                        <xsd:element name="Subject" 
type="xsd:string" />
                                        <xsd:element name="Body" 
type="xsd:string" />
                                </xsd:sequence>
                        </xsd:complexType>


Wsdlgen (the ant task) nicely makes the emailaddresses into a nice List<String> 
for me.  However, it doesn't generate a setter.  (It merrily makes 
documentation telling me that JAXB is very clever, I don't need one, that the 
getter gives me a live list)

However, without the setter, any consumer of this service can't set any email 
addresses. They get the soap fault in the headline, and in the bug.

I'm sure JAXB is correct in that I don't need the setter in the normal server 
side java code, but, well, I never need to edit the RequestMessage stuff 
anyway, I tend to treat the RequestMessage as readonly really.  But I would 
really like to allow clients to set data in the request object.

I'm not using java clients, so the closing comment in the bug is irrelevant (as 
it should be)

Cheers,
Karl P


"Full config" for what it's worth.........
Generated MailAnyStringRequest.java (from the wsdl, with the xfire ant task 
wsdlgen)


package com.industria.services.troubleticketing.mailer;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for MailAnyStringRequest complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained 
within this class.
 * 
 * <pre>
 * &lt;complexType name="MailAnyStringRequest">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType";>
 *       &lt;sequence>
 *         &lt;element name="EmailAddresses" 
type="{http://www.w3.org/2001/XMLSchema}string"; maxOccurs="unbounded"/>
 *         &lt;element name="Subject" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="Body" 
type="{http://www.w3.org/2001/XMLSchema}string"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MailAnyStringRequest", propOrder = {
    "emailAddresses",
    "subject",
    "body"
})
public class MailAnyStringRequest {

    @XmlElement(name = "EmailAddresses", required = true)
    protected List<String> emailAddresses;
    @XmlElement(name = "Subject", required = true)
    protected String subject;
    @XmlElement(name = "Body", required = true)
    protected String body;
 
    /**
     * Gets the value of the emailAddresses property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the 
emailAddresses property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getEmailAddresses().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * [EMAIL PROTECTED] String }
     * 
     * 
     */
    public List<String> getEmailAddresses() {
        if (emailAddresses == null) {
            emailAddresses = new ArrayList<String>();
        }
        return this.emailAddresses;
    }
 
//************************************
// This line manually added to make it work   
    public void setEmailAddresses(List<String> emailAddresses) 
{this.emailAddresses = emailAddresses;}
//************************************


    /**
     * Gets the value of the subject property.
     * 
     * @return
     *     possible object is
     *     [EMAIL PROTECTED] String }
     *     
     */
    public String getSubject() {
        return subject;
    }

    /**
     * Sets the value of the subject property.
     * 
     * @param value
     *     allowed object is
     *     [EMAIL PROTECTED] String }
     *     
     */
    public void setSubject(String value) {
        this.subject = value;
    }

    /**
     * Gets the value of the body property.
     * 
     * @return
     *     possible object is
     *     [EMAIL PROTECTED] String }
     *     
     */
    public String getBody() {
        return body;
    }

    /**
     * Sets the value of the body property.
     * 
     * @param value
     *     allowed object is
     *     [EMAIL PROTECTED] String }
     *     
     */
    public void setBody(String value) {
        this.body = value;
    }

}


The server side config files are:

webservices.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd";>
<beans>

        <!--  developers edit this to name the service.  put any name you want, 
and point to the right class -->
        <bean id="test1" 
class="com.industria.ims.troubleticketing.mailer.MailerImpl" />
</beans>

xfire-servelet.xml: (default I believe)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd";>
<beans>

        <!--  this file does NOT need to be changed by developers! -->
        <bean id="webAnnotations"
                
class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations" />
        <bean id="handlerMapping"
                class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping">
                <property name="typeMappingRegistry">
                        <ref bean="xfire.typeMappingRegistry" />
                </property>
                <property name="xfire">
                        <ref bean="xfire" />
                </property>
                <property name="webAnnotations">
                        <ref bean="webAnnotations" />
                </property>
        </bean>

        <bean 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
                <property name="urlMap">
                        <map>
                                <entry key="/">
                                        <ref bean="handlerMapping" />
                                </entry>
                        </map>
                </property>
        </bean>

        <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
        <import resource="classpath:webservices.xml"/>
</beans>


Web-inf\web.xml (again, default I believe)

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
        <!--  *******************************    -->
        <!--  this is the only part you need to change -->
        <display-name>Mailer2</display-name> 
        <description>A service that handles mailing faults</description> 
        <!--  down to here -->
        <!--  *******************************      -->
        <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:xfire-servlet.xml</param-value>
        </context-param>
        <servlet>
                <servlet-name>XFireServlet</servlet-name>
                <display-name>XFire Servlet</display-name>
                <servlet-class>
                        org.codehaus.xfire.spring.XFireSpringServlet
                </servlet-class>
        </servlet>
        <servlet-mapping>
             <servlet-name>XFireServlet</servlet-name>
             <url-pattern>/servlet/XFireServlet/*</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
                <servlet-name>XFireServlet</servlet-name>
                <url-pattern>/services/*</url-pattern>
        </servlet-mapping>
        <listener>
                <listener-class>
                        org.springframework.web.context.ContextLoaderListener
                </listener-class>
        </listener>
</web-app>

Reply via email to