Not sure if someone has posted this workaround before, but I didn't see anything after a quick search on "Castor"...

Anyway, using Castor to unmarshall an XML request payload may fail if namespaces are declared outside of the payload (such as on a SOAP envelope). To work around the issue, you can extend the CastorMarshaller class and override the following method:

Code:
    private static final String XMLNS_NS = XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
    
    protected Object unmarshalDomSource(DOMSource domSource) throws XmlMappingException {
        
        Node node = domSource.getNode();
        if (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
            Element element = (Element)node;
            
            Node parent = node.getParentNode();
            while (parent != null) {
                NamedNodeMap atts = parent.getAttributes();
                if (atts != null) {
                    for (int i=0, j=atts.getLength(); i<j; i++) {
                        
                        Attr att = (Attr) atts.item(i);
                        if (XMLNS_NS.equals(att.getNamespaceURI())) {
                            String name = att.getName();
                            String value = att.getValue();     
                            if (!element.hasAttributeNS(XMLNS_NS, name)) {
                                }
                                element.setAttributeNS(XMLNS_NS, name, value);
                            }
                        }
                        
                    }
                }
                parent = parent.getParentNode();
            }
        }
        
        return super.unmarshalDomSource(domSource);
    }