spring


javaee and spring24 六 2010 05:31 下午

1、web容器改默认端口为自定义端口
在D:\jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\server.xml
找到
<Connector protocol=”HTTP/1.1″ port=”8080″ address=”${jboss.bind.address}” connectionTimeout=”20000″ redirectPort=”8443″ />
port=”8080″改为自定义端口
2、让非本机的局域网地址访问web容器
默认ip绑定的只能通过127.0.0.1:8080/来访问。
修改D:\jboss-5.1.0.GA\bin\run.bat
找到-Djava.endorsed.dirs=”%JBOSS_ENDORSED_DIRS%” ^
在上边加一行
-Djboss.bind.address=0.0.0.0 ^
变为如下
:RESTART
“%JAVA%” %JAVA_OPTS% ^
-Djboss.bind.address=0.0.0.0 ^
-Djava.endorsed.dirs=”%JBOSS_ENDORSED_DIRS%” ^
-classpath “%JBOSS_CLASSPATH%” ^
org.jboss.Main %*

3、包隔离发布
在xxx.war\WEB-INF\目录下新增jboss-web.xml
内容如下
<!DOCTYPE jboss-web PUBLIC “-//JBoss//DTD Web Application 5.0//EN”
“http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd”>
<jboss-web>

<class-loading java2ClassLoadingCompliance=’true’>
<loader-repository>com.footmarktech:archive=helloworld-0.0.1
<loader-repository-config>java2ParentDelegaton=true</loader-repository-config>
</loader-repository>
</class-loading>

<context-root>helloworld</context-root>
</jboss-web>
4、中文乱码
在D:\jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\server.xml
找到
<Connector protocol=”HTTP/1.1″ port=”8080″ address=”${jboss.bind.address}” connectionTimeout=”20000″ redirectPort=”8443″ />
增加attribute URIEncoding=’UTF-8′
变成<Connector protocol=”HTTP/1.1″ port=”8080″ address=”${jboss.bind.address}” connectionTimeout=”20000″ redirectPort=”8443″ attribute URIEncoding=’UTF-8′/>
5、jboss5部署数据源
1)把mysql的jdbc驱动包mysql-connector-java-5.1.7-bin.jar放进D:\jboss-5.1.0.GA\server\default\lib\中
2)D:\jboss-5.1.0.GA\server\default\deploy中新增一个文件名为mysql-ds.xml
内容如下
<?xml version=”1.0″ encoding=”UTF-8″?>
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://127.0.0.1:3306/mytest?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<!– should only be used on drivers after 3.22.1 with “ping” support
<valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
–>
<!– sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
–>
<!– sql to call on an existing pooled connection when it is obtained from pool – MySQLValidConnectionChecker is preferred for newer drivers
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
–>

<!– corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) –>
<!–
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>–>
</local-tx-datasource>
</datasources>
3)使用spring获取数据源

<bean id=”dataSource”>
<property name=”jndiName”><value>java:/MySqlDS</value></property>
<property name=”resourceRef”><value>false</value></property>
<property name=”jndiEnvironment”>
<props>
<prop key=”java.naming.provider.url”>jnp://localhost:1099</prop>
<prop key=”java.naming.factory.initial”>org.jnp.interfaces.NamingContextFactory</prop>
</props>
</property>
</bean>
4)错误
错误1
2010-06-21 06:46:16,934 WARN  [org.jboss.resource.connectionmanager.JBossManagedConnectionPool] (main) Throwable while attempting to get a new connection: null
org.jboss.resource.JBossResourceException: Could not create connection; – nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: com.mysql.jdbc.Driver, url: jdbc:mysql://127.0.0.1:3306/mytest?user=root&password=root&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8)
at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:225)
at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:195)

由于mysqljdbc驱动包没有被提前加载,将mysqljdbc驱动放到server/default/lib下即可

错误2
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: The reference to entity "password" must end with the ';' delimiter.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:514)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:215)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:190)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:238)
at org.jboss.resource.deployers.ManagedConnectionFactoryParserDeployer.parse(ManagedConnectionFactoryParserDeployer.java:123)
at org.jboss.resource.deployers.ManagedConnectionFactoryParserDeployer.parse(ManagedConnectionFactoryParserDeployer.java:63)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parseAndInit(AbstractVFSParsingDeployer.java:256)
at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parse(AbstractVFSParsingDeployer.java:239)
at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:355)
… 33 more
Caused by: org.xml.sax.SAXParseException: The reference to entity “password” must end with the ‘;’ delimiter.

jdbc驱动链接书写不正确
jdbc:mysql://127.0.0.1:3306/mytest?user=root&password=root&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
jdbc:mysql://127.0.0.1:3306/mytest?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8

javaee and spring24 六 2010 05:28 下午

1)将mysql数据库jdbc驱动mysql-connector-java-5.1.7-bin.jar放置于D:\resin-3.1.9\ext-lib目录下

2)D:\resin-3.1.9\conf\resin.conf增加

<database>

<jndi-name>jdbc/mysql</jndi-name>

<driver type=”com.mysql.jdbc.Driver”>

<url>jdbc:mysql://localhost:3306/fare?user=root&amp;password=root&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8</url>

<user>root</user>

<password>root</password>

</driver>

<prepared-statement-cache-size>8</prepared-statement-cache-size>

<max-connections>20</max-connections>

<max-idle-time>30s</max-idle-time>

</database>

3)spring中通过jndi获取数据源

<bean id=”dataSource”>

<property name=”jndiName”><value>java:comp/env/jdbc/mysql</value></property>

</bean>

javaee and spring and websphere11 二 2010 01:52 下午

环境
IBMWAS6.1.0.29
spring2.5.6
hibernate3.3.1GA
jconn3驱动
Sybase15

java.sql.SQLException: JZ0PA: The query has been cancelled and the response discarded. The cancel was probably issued by another statement on the connection.
java.sql.SQLException: JZ0PA: 已取消查询,响应被放弃。取消指令可能由连接上的另一语句发出。
at com.sybase.jdbc3.jdbc.ErrorMessage.raiseError(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.getUpdateCount(Unknown Source)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.closeWrapper(WSJdbcPreparedStatement.java:445)
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.close(WSJdbcObject.java:185)
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.close(WSJdbcObject.java:144)
at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:563)
at org.hibernate.jdbc.AbstractBatcher.closeStatement(AbstractBatcher.java:291)
at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:307)
at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:234)
at org.hibernate.loader.Loader.doQuery(Loader.java:749)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2228)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
at org.hibernate.loader.Loader.list(Loader.java:2120)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:343)
at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)

原因是由于刚更新了WAS6.1.0.29,回滚到WAS6.1.0.21,问题消失。29解决办法还未找到。

javaee and spring05 二 2010 11:10 上午

<bean id=”myMessageSource” class=”org.springframework.context.support.ResourceBundleMessageSource”>
<property name=”basenames”>
<list><value>mymessage</value></list>
</property>
</bean>

默认
mymessage.properties
中文
mymessage_zh_CN.properties
英文
mymessage_en_US.properties

首先要把中文的配置给native2ascii化
使用sunjdk的native2ascii
native2ascii mymessage.properties mymessage_zh_CN.properties
执行后发现是乱码,由于我的编译环境是utf-8,加传一个encoding参数如下
native2ascii -encoding UTF-8 mymessage.properties mymessage_zh_CN.properties
乱码没了

javaee and spring01 二 2010 10:58 上午

使用场景
spring2.5.6
hibernate3.3.1GA
Sybase15
jconn3驱动
使用spring的jdbctemplate调用Sybase15的存储过程报错
ERROR: ConnectionCallback; uncategorized SQLException for SQL []; SQL state [ZZZZZ]; error code [7713]; Stored procedure ‘proc_xxx’ may be run only in unchained transaction mode. The ‘SET CHAINED OFF’ command will cause the current session to use unchained transaction mode.;
nested exception is com.sybase.jdbc3.jdbc.SybSQLException: Stored procedure ‘proc_xxx’ may be run only in unchained transaction mode. The ‘SET CHAINED OFF’ command will cause the current session to use unchained transaction mode.
org.springframework.jdbc.UncategorizedSQLException: ConnectionCallback; uncategorized SQLException for SQL []; SQL state [ZZZZZ]; error code [7713]; Stored procedure ‘proc_xxx’ may be run only in unchained transaction mode. The ‘SET CHAINED OFF’ command will cause the current session to use unchained transaction mode.;
nested exception is com.sybase.jdbc3.jdbc.SybSQLException: Stored procedure ‘proc_xxx’ may be run only in unchained transaction mode. The ‘SET CHAINED OFF’ command will cause the current session to use unchained transaction mode.
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:349)
Caused by: com.sybase.jdbc3.jdbc.SybSQLException: Stored procedure ‘proc_xxx’ may be run only in unchained transaction mode. The ‘SET CHAINED OFF’ command will cause the current session to use unchained transaction mode.
at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
at com.sybase.jdbc3.tds.Tds.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.executeLoop(Unknown Source)
at com.sybase.jdbc3.jdbc.SybCallableStatement.execute(Unknown Source)
at weblogic.jdbc.wrapper.PreparedStatement.execute(PreparedStatement.java:70)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:342)
… 48 more

解决办法
1)在调用存储过程的代码
conn.setAutoCommit(true);//SET CHAINED OFF
CallableStatement cstmt = conn.prepareCall(“{call proc_xxx(?) }”);
//
conn.setAutoCommit(false);//SET CHAINED ON
2)或者在数据库中执行如下sql语句
sp_procxmode proc_xxx, “chained”

参考资料

http://forum.springsource.org/showthread.php?t=49398

http://manuals.sybase.com/onlinebook…iew/55096;hf=0

http://manuals.sybase.com/onlinebook…w/53740;hf=0#X

javaee and spring05 一 2010 09:36 下午

契约式开发webservice实践之spring-ws+Xmlbeans
1、开发环境
JDK1.4.2.*
Tomcat6.0.*
Spring-2.5.5
Spring-ws-1.5.4
XmlBeans-2.3

2、确定需要请求和应答的xml实例
Request.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<wl_request  xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://footmarktech.com/samples”>
<flights>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
</flights>
</wl_request>

Response.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<wl_response  xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://footmarktech.com/samples”>
<flights>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
<flight><segment>PEK-CAN<segment><ticketNo>7841234656</ticketNo></flight>
</flights>
</wl_response>

3、设置XmlBeans环境
设置XMLBEANS_HOME
并将 %XMLBEANS_HOME%/bin增加到path路径中

4、使用xmlbeans tool准备数据契约xsd
根据上一步骤请求和应答的实例xml执行如下命令
inst2xsd -enumerations never Request.xml Response.xml
将生成的schema0.xsd文件命名为 Airline.xsd

将 Airline.xsd放在 ${web-context}/WEB-INF目录下
5、使用xmlbeans tool生成OXM数据映射对象
需要说明的是这些对象是跟Xmlbeans耦合比较紧的,不是POJO
执行如下命令
scomp -out Airline.jar Airline.xsd

6、准备运行时和编译时jar包

<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/acegi-security-1.0.7.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/activation-1.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/antlr-2.7.7.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/aopalliance-1.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/axiom-api-1.2.6.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/axiom-dom-1.2.6.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/axiom-impl-1.2.6.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/backport-util-concurrent-3.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/bsf-2.3.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/cglib-nodep-2.1_3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-beanutils-1.7.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-codec-1.3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-collections-3.2.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-configuration-1.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-digester-1.8.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-discovery-0.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-el-1.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-fileupload-1.2.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-httpclient-3.0.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-io-1.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-lang-2.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-logging-1.1.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-net-1.2.2.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-pool-1.3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/commons-validator-1.3.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/concurrent-1.3.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/dom4j-1.6.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/ehcache-1.2.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/ezmorph-1.0.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/groovy-all-1.5.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/hibernate-3.2.6.ga.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/hsqldb-1.8.0.7.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/icu4j-3.4.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jasypt-1.4.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/javassist-3.6.ga.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jaxen-1.1.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jaxrpc-1.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jcaptcha-all-1.0-RC6.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jcr-1.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jdom-1.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/json-lib-2.2.1-jdk13.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jta-spec1_0_1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/log4j-1.2.15.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/lucene-core-2.2.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/mail-1.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/mysql-connector-java-5.1.5-bin.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/ognl-2.7.2.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/oro-2.0.8.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/oscache-2.4.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/pdfbox-0.6.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/poi-3.0.1-FINAL-20070705.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/poi-contrib-3.0.1-FINAL-20070705.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/poi-scratchpad-3.0.1-FINAL-20070705.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/proxool-0.9.0RC3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/serializer-2.7.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/slf4j-api-1.4.3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/slf4j-log4j12-1.4.3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-2.5.5.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/stax-api-1.0.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/wsdl4j-1.6.2.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/wstx-asl-3.2.3.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xalan-2.7.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xercesImpl-2.8.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xfire-all-1.2.6.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xml-apis-1.3.04.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xom-1.1.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xpp3_min-1.1.3.4.0.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xstream-1.2.2.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/axis-saaj-1.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/axis-1.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-oxm-1.5.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-webmvc-2.5.5.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-ws-core-1.5.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-ws-security-1.5.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-ws-support-1.5.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/spring-xml-1.5.4.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/jsr173_1.0_api.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/resolver.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xbean_xpath.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xbean.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xmlbeans-qname.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/xmlpublic.jar”/>
<classpathentry kind=”lib” path=”web/src/context/WEB-INF/lib/Airline.jar”/>
<classpathentry kind=”output” path=”web/src/context/WEB-INF/classes”/>

Spring-ws1.5.4必须使用springframework2.5版本以上
其对org.springframework.core.io.Resource版本要求较高
必须加入spring-webmvc-2.5.5.jar
org.springframework.web.servlet.FrameworkServlet从2.5版本后被分到spring- webmvc.jar包,并不包含于主spring包内

注,可能有些jar包没有用到
7、书写web.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN” “http://java.sun.com/dtd/web-app_2_3.dtd”>
<web-app>
<display-name>Web</display-name>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>ws-spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ws-spring-ws</servlet-name>
<url-pattern>/spring-ws/*</url-pattern>
</servlet-mapping>

</web-app>

8、书写业务实现

package demo1;

public class Order {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

package demo1;

public interface OrderService {
Order getOrder(String id);
}

package demo1;

public class OrderServiceImpl implements OrderService{
public Order getOrder(String id) {
Order order = new Order();
order.setId(id);
return order;
}

}

书写spring配置放在classpath下
applicationContext.xml

<?xml version=”1.0″ encoding=”UTF-8″?>

<!DOCTYPE beans PUBLIC
“-//SPRING//DTD BEAN//EN”
“http://www.springframework.org/dtd/spring-beans.dtd”>

<beans default-autowire=”no” default-lazy-init=”false” default-dependency-check=”none”>
<bean id=”orderService”/>
</beans>

9、书写Spring-ws EndPoint

package demo1;

import org.springframework.oxm.Marshaller;
import org.springframework.ws.server.endpoint.AbstractMarshallingPayloadEndpoint;

import com.footmarktech.samples.WlRequestDocument;
import com.footmarktech.samples.WlResponseDocument;

public class SampleMarshallingEndpoint extends
AbstractMarshallingPayloadEndpoint {

private final OrderService orderService;

public SampleMarshallingEndpoint(OrderService orderService,
Marshaller marshaller) {
super(marshaller);
this.orderService = orderService;
}

protected Object invokeInternal(Object request) throws Exception {
com.footmarktech.samples.WlRequestDocument ab = null;
ab = (WlRequestDocument)request;

//TODO invoke orderService

WlResponseDocument rs = (WlResponseDocument) WlResponseDocument.Factory.newInstance();
rs.addNewWlResponse().addNewFlights().addNewFlight().setTicketNo(ab.getWlRequest().getFlights().getFlightArray(0).getTicketNo());
return rs;
}
}

10、书写ws-spring-ws-servlet.xml
放置于${web-context}/WEB-INF目录下

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>

<bean id=”messageFactory”>
<property name=”payloadCaching” value=”true”/>
</bean>
<bean id=”xmlBeansMarshaller” />
<bean id=”orderEndPoint”>
<constructor-arg><ref bean=”orderService”/></constructor-arg>
<constructor-arg><ref bean=”xmlBeansMarshaller”/></constructor-arg>
</bean>
<bean id=”payloadMapping”>
<property name=”defaultEndpoint” ref=”orderEndPoint”/>
</bean>
<bean id=”echo”>
<property name=”schema”>
<bean>
<property name=”xsd” value=”/WEB-INF/Airline.xsd”/>
</bean>
</property>
<property name=”portTypeName” value=”Echo”/>
<property name=”locationUri” value=”http://localhost:8080/ss1/spring-ws/echo/services”/>
</bean>

</beans>

11、开发客户端

配置applicationContext1.xml放置于 classpath demo1.client包内

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>

<bean id=”xmlBeansMarshaller” />

<bean id=”messageFactory”>
<property name=”payloadCaching” value=”true”/>
</bean>

<bean id=”webServiceTemplate1″>
<constructor-arg ref=”messageFactory” />
<property name=”marshaller” ref=”xmlBeansMarshaller” />
<property name=”unmarshaller” ref=”xmlBeansMarshaller” />
<property name=”messageSender”>
<bean>
<property name=”readTimeout” value=”0″ />
</bean>
</property>
<property name=”defaultUri” value=”http://localhost:8080/ss1/spring-ws/echo/services” />
</bean>
</beans>

package demo1.client;

import java.io.File;
import java.io.IOException;

import javax.xml.transform.Source;

import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.jdom.JDOMException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.xml.transform.ResourceSource;
import org.springframework.xml.transform.StringResult;

import com.footmarktech.smscenter.webservice.SendSMDocument;
import com.footmarktech.smscenter.webservice.SendSMResponseDocument;
import com.footmarktech.samples.WlRequestDocument;
import com.footmarktech.samples.WlResponseDocument;

public class EchoClient {
public static void RequestSpring() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“applicationContext1.xml”, EchoClient.class);
WebServiceTemplate webServiceTemplate = (WebServiceTemplate) applicationContext
.getBean(“webServiceTemplate1″);
WlRequestDocument request = WlRequestDocument.Factory.newInstance();
request.addNewWlRequest().addNewFlights().addNewFlight().setTicketNo(new Long(1231235555).longValue());

WlResponseDocument response = (WlResponseDocument)webServiceTemplate.marshalSendAndReceive(request);
System.out.println(response.getWlResponse().getFlights().getFlightArray(0).getTicketNo());
}

public static void main(String[] args) throws IOException, JDOMException {
RequestSpring();

}

}

12、参考资料

http://xmlbeans.apache.org/

http://static.springframework.org/spring-ws/sites/1.5/reference/html/index.html

http://mdasgin.blogspot.com/2008/06/web-servisleri-bir-makinede-sunulan.html

http://www.infoq.com/cn/articles/arjen-poutsma-spring-ws

http://www.infoq.com/cn/articles/sosnoski-code-first

http://www.developer.com/design/article.php/10925_3745701_1

http://www.infoq.com/articles/os-ws-stacks-background

javaee and spring and websphere16 七 2009 10:38 下午

访问集群中的datasource数据源
<bean id=”dataSource” class=”org.springframework.jndi.JndiObjectFactoryBean”>
<property name=”jndiTemplate”>
<bean class=”org.springframework.jndi.JndiTemplate”>
<constructor-arg>
<props>
<prop key=”java.naming.factory.initial”>com.ibm.websphere.naming.WsnInitialContextFactory</prop>
<prop key=”java.naming.provider.url”>corbaloc::host1:2809,:host2:2809,:host1:2810,:host2:2810</prop>
</props>
</constructor-arg>
</bean>
</property>
<property name=”jndiName”>
<value>jdbc/datasource1</value>
</property>
</bean>
访问集群中StatelessSessionBean
<bean id=”yourEjbClient” class=”org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean”>
<property name=”jndiName”><value>ejb/YourEjbService</value></property>
<property name=”refreshHomeOnConnectFailure”><value>true</value></property>
<property name=”jndiEnvironment”>
<props>
<prop key=”java.naming.factory.initial”>com.ibm.websphere.naming.WsnInitialContextFactory</prop>
<prop key=”java.naming.provider.url”>corbaloc::host1:2809,:host2:2809,:host1:2810,:host2:2810</prop>
</props>
</property>
<property name=”businessInterface”><value>common.ejb.YourEjbService</value></property>
</bean>

javaee and spring and weblogic21 六 2009 06:36 下午

第1步
开发基于POJI的POJO的业务实现,最基本的我们经常那么干的

第2步
使用Spring的xml解耦合这些POJO实现
产生applicationContext-datasource.xml 等

第3步
消息驱动Bean开发继承自org.springframework.ejb.support.AbstractMessageDrivenBean
给消息驱动Bean注入第二步的Beanfactory,在onMessage(Message message)中调用beanFactory中的
POJO实现业务处理,消息驱动Bean是Spring工厂的消费类。

第4步
部署消息驱动Bean,消息驱动Bean是JMS的消息处理Bean

第5步
书写特定容器的配置文件绑定JNDI

附开发实例文件如下

weblogic-ejb-jar.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE weblogic-ejb-jar PUBLIC “-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN” “http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd”>
<weblogic-ejb-jar>
<description>Test</description>
<weblogic-enterprise-bean>
<ejb-name>MyMessageDrivenBean</ejb-name>
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>8</max-beans-in-free-pool>
<initial-beans-in-free-pool>1</initial-beans-in-free-pool>
</pool>
<destination-jndi-name>jms/DestMyMessageQueue</destination-jndi-name>
<initial-context-factory>weblogic.jndi.WLInitialContextFactory</initial-context-factory>
<provider-url>t3://localhost:7001</provider-url>
<!– 如果JMS和EJB容器不在一台机器上指定该JMS provider-url–>
<connection-factory-jndi-name>jms/MyMessageDrivenBean</connection-factory-jndi-name>
<jms-polling-interval-seconds>10</jms-polling-interval-seconds>
<!–jms-client-id>myMessageDrivenBean</jms-client-id–>
</message-driven-descriptor>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>

META-INF/ejb-jar.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE ejb-jar PUBLIC “-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN” “http://java.sun.com/dtd/ejb-jar_2_0.dtd”>
<ejb-jar id=”ejb-jar_1″>
<description>ejb</description>
<display-name>ejb</display-name>
<enterprise-beans>
<message-driven id=”MessageDriven_1″>
<description>MyMessageDrivenBean</description>
<display-name>Name for MyMessageDrivenBean</display-name>
<ejb-name>MyMessageDrivenBean</ejb-name>
<ejb-class>service.MyMessageDrivenBean</ejb-class>
<transaction-type>Bean</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
<assembly-descriptor id=”AssemblyDescriptor_1″>
</assembly-descriptor>
</ejb-jar>

消息驱动Bean加载所需要的POJObeanFactory的Bean资源
beanRefContext.xml

<bean id=”businessBeanFactory”
>
<constructor-arg>
<list>
<value>applicationContext-datasource.xml</value>
<value>applicationContext.xml</value>
<value>applicationContext-service.xml</value>
</list>
</constructor-arg>
</bean>

消息驱动Bean
MyMessageDrivenBean.java

package service;

import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.TextMessage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.access.ContextSingletonBeanFactoryLocator;
import org.springframework.ejb.support.AbstractMessageDrivenBean;

public class MyMessageDrivenBean extends AbstractMessageDrivenBean implements
MessageDrivenBean, MessageListener {

private static final long serialVersionUID = 7819604050800044554L;

private static Log log = LogFactory.getLog(MyMessageDrivenBean.class); // log

/**
* for spring inject this property
*/
private MessageHandelService messageHandelService;

public MessageHandelService getMessageHandelService() {
return messageHandelService;
}

public void setMessageHandelService(
MessageHandelService messageHandelService) {
this.messageHandelService = messageHandelService;
}

protected void onEjbCreate() {
this.setMessageHandelService((MessageHandelService) getBeanFactory()
.getBean(“messageHandelService”));
/**
* 从spring 工厂bean中得到需要的业务实现,业务实现是基于POJI的POJO实现
* 本身消息驱动Bean只负责暴露接口JNDI来接受JMS的Queue并调用POJI的POJO实现处理业务逻辑
* 就是真正的业务逻辑是写在POJO中实现的 消息驱动Bean相对于Spring来说是Bean消费者
*/
}

public void onMessage(Message message) {

if (message instanceof ObjectMessage) { // 如果接受的消息是序列化后的对象,直接强制转换
ObjectMessage objMessage = (ObjectMessage) message;
MyDomain model = null;
try {
model = (MyDomain) objMessage.getObject();
} catch (JMSException e) {
e.printStackTrace();
}
}
// 业务处理调用接口
this.getMessageHandelService().doFoo();

if (message instanceof TextMessage) {

}

}

public void setMessageDrivenContext(
MessageDrivenContext messageDrivenContext) {
super.setMessageDrivenContext(messageDrivenContext);
setBeanFactoryLocator(ContextSingletonBeanFactoryLocator.getInstance());// 指定默认的beanRefContext.xml
setBeanFactoryLocatorKey(“businessBeanFactory”);
}

}