匹配的通配符是严格的,但是找不到元素'fss:oauth'的声明

时间:2012-01-03 10:54:58

标签: java spring-security

我正在尝试构建一个Java应用程序,该应用程序使用Database.com Java SDK访问存储在Database.com中的数据。我已经按照qucik start guide @ http://forcedotcom.github.com/java-sdk/quick-start中给出的步骤进行了操作。当应用程序部署在tomcat服务器上时,我得到以下异常

SEVERE: Exception sending context initialized event to listener instance of class     org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.parsing.BeanDefinitionParsingException:    Configuration problem: Failed to import bean definitions from relative location [security-    config.xml]
Offending resource: ServletContext resource [/WEB-INF/spring/servlet-context.xml];   nested exception is   org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:   Line 15 in XML   document from ServletContext resource [/WEB-INF/spring/security-config.xml] is invalid;   nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching   wildcard is strict, but no declaration can be found for element 'fss:oauth'.
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76)
at 

以下是 security-config.xml 代码。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:fss="http://www.salesforce.com/schema/springsecurity"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.salesforce.com/schema/springsecurity
        http://media.developerforce.com/schema/force-springsecurity-1.2.xsd">

<!-- SFDC OAuth security config -->
<fss:oauth logout-from-force-dot-com="true">
    <fss:connectionName name="forceDatabase"/>
</fss:oauth>


<!-- Configure Spring Security -->
<!-- use-expressions and hasRole only needed if jsp tags are used. 
    If not using jsp tags you can omit the use-expressions property and set access="ROLE_USER" on the intercept-url tags -->
<security:http entry-point-ref="authenticationProcessingFilterEntryPoint" use-expressions="true">

    <security:anonymous />

    <!--  Uncomment this section to enable security -->

    <!-- 
    <security:intercept-url pattern="/**" access="isAuthenticated()" />
     -->

    <!-- sets this as the authentication filter over the default -->
    <security:custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter"/>
    <security:custom-filter position="LOGOUT_FILTER" ref="logoutFilter"/>
</security:http>

我可以看到元素oauth在xsd http://media.developerforce.com/schema/force-springsecurity-1.2.xsd处可用。我已经尝试将其更改为xsd的不同版本。但我没有成功。

请帮我解决此问题。

7 个答案:

答案 0 :(得分:5)

我不确定这是否会有所帮助,但我在标签上遇到了类似的问题:。

这是我的XML:

 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xmlns:context="http://www.springframework.org/schema/context"   
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<jaxws:endpoint id="HelloWorldService" implementor="com.client.webservices.ratecard.StandardHelloWorldService" address="/HelloWorldService" />          

我尝试了一切无济于事,直到我发现某个Eclipse代理设置为直接并且我在代理后面。我仍然可以从Apache站点(http://cxf.apache.org/jaxws)获得第一组XSD定义,但是在其中你可以看到他们正在导入更多的XSD,此时重定向失败了因此我得到了非常奇怪的错误。

然后我在首选项中将Eclipse代理设置为Native,错误神奇地消失了。

我希望这也适用于您的情况。

答案 1 :(得分:1)

这通常意味着您的类路径设置不正确,它不是xsd问题。要验证(如果您使用的是Eclipse),可以右键单击该文档并单击“验证”。如果xsd使用Eclipse验证,那么您不必担心该部分。

我认为发生的是Spring发现XSD并验证但是当它遇到fss:oauth标记时,它会尝试找到一个注册的Java类来实现该标记的行为并失败。您确定在类路径上有Salesforce jar吗?

答案 2 :(得分:0)

我注意到在包含的模式force-springsecurity-1.2.xsd中,前缀beans未定义。如果修改

怎么办?

<beans xmlns="http://www.springframework.org/schema/beans"

<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"

(也是最后一行)?

答案 3 :(得分:0)

遵循Aravind的建议我只是依赖于我的POM。

<dependency>
    <groupId>org.kubek2k</groupId>
    <artifactId>springockito</artifactId>
 </dependency>

实际上你只需要将mockito.xsd放在你的路径中。

答案 4 :(得分:0)

问题是元素fss:oauth应该在www.salesforce.com/schema/springsecurity列出的模式(xsd文件)中定义,如页面顶部的声明xmlns:fss="http://www.salesforce.com/schema/springsecurity"中所定义。 / p>

然而,应该在该网址中的 xsd 文件就不存在了。我猜Salesforce搬了它。如果您转到www.salesforce.com/schema/springsecurity,则表示您收到404错误。

答案 5 :(得分:0)

我遇到了同样的问题,我发现应用程序试图从互联网上获取xsd文件,而不是使用jar文件。导致该问题的原因是spring.schemas文件与applicationContext.xml文件中指定的位置之间的xsd位置定义不匹配。在applicationContext.xml文件中将网址从http://media.developerforce.com/schema/force-springsecurity-1.3.xsd更改为http://www.salesforce.com/schema/springsecurity/force-springsecurity-1.3.xsd解决了我的问题。

答案 6 :(得分:0)

我有一个类似的问题,通过SFDC的集成教程。在我搜索解决问题的过程中,我在force.com github repo上找到了这个issue

根据Github用户todc

  

我认为,问题在于media.developerforce.com网址,而不是salesforce.com网址。鉴于回购时代和最近缺乏活动,我猜测XSD文件不会再次可用。

     

我能够在以下位置找到XSD文件的存档版本:

     

http://grepcode.com/file/repo1.maven.org/maven2/com.force.sdk/force-springsecurity/22.0.8-BETA/com/force/sdk/springsecurity/config/force-springsecurity-1.2.xsd?av=f

     

您可以将该文件打包到您的应用中,并改为参考本地副本,例如

<beans xmlns="http://www.springframework.org/schema/beans"
   xsi:schemaLocation="http://www.salesforce.com/schema/springsecurity
                       classpath:force-springsecurity-1.2.xsd">
</beans>
  

这可能是一种更好的方式,但那是我能够发挥作用的方式。祝你好运!

Github用户iandrosov声明

  

我现在主持这个&#34;已弃用&#34; Heroku上的fiorsce-springsecurity-1.2.xsd可以访问may应用程序。在这里分享我的公共URL,这样可以帮助其他人。 http://force-spring.herokuapp.com/force-springsecurity-1.2.xsd

我通过使用iandrosov的托管xsd文件解决了这个问题,取代了原来的

http://media.developerforce.com/schema/force-springsecurity-1.3.xsd

使用托管的xsd

http://force-spring.herokuapp.com/force-springsecurity-1.2.xsd

我之所以这样做,只是因为我正在做一个教程。对于遇到此问题的其他人来说,可能更好,因为Github用户todc建议和

  

将文件打包到您的应用程序中,然后参考本地副本。