提交 1dff3fcb 编写于 作者: C Calvin

#57 将mini-service中的SOAP WebService部分移入showcase,虽然很少用了,但删掉也太可惜了。

上级 ec22beaa
......@@ -14,7 +14,7 @@
<spring.version>3.1.2.RELEASE</spring.version>
<aspectj.version>1.7.0</aspectj.version>
<hibernate.version>4.1.5.SP1</hibernate.version>
<spring-data-jpa.version>1.1.1.RELEASE</spring-data-jpa.version>
<spring-data-jpa.version>1.1.0.RELEASE</spring-data-jpa.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
<sitemesh.version>2.4.2</sitemesh.version>
<hibernate-validator.version>4.3.0.Final</hibernate-validator.version>
......
......@@ -70,6 +70,16 @@
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- spring data access -->
<dependency>
......@@ -139,6 +149,21 @@
<artifactId>shiro-ehcache</artifactId>
</dependency>
<!-- SECURITY end -->
<!-- SOAP begin -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</dependency>
<!-- SOAP end -->
<!-- JMS begin -->
<dependency>
......
package org.springside.examples.showcase.dao;
import java.util.List;
import java.util.Map;
import org.springside.examples.showcase.entity.Project;
import org.springside.examples.showcase.entity.User;
public interface UserMybatisDao {
public Project getProjectDetail(Long id);
public List<User> searchUser(Map<String, Object> parameters);
public Long saveUser(User user);
public void deleteUser(Long id);
}
package org.springside.examples.showcase.dao;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Component;
import org.springside.examples.showcase.entity.Project;
import org.springside.examples.showcase.entity.User;
@Component
public class UserMybatisDaoImpl implements UserMybatisDao {
@Override
public Project getProjectDetail(Long id) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<User> searchUser(Map<String, Object> parameters) {
// TODO Auto-generated method stub
return null;
}
@Override
public Long saveUser(User user) {
// TODO Auto-generated method stub
return null;
}
@Override
public void deleteUser(Long id) {
// TODO Auto-generated method stub
}
}
package org.springside.examples.showcase.entity;
import java.util.List;
import com.google.common.collect.Lists;
/**
* 项目.
*
* @author calvin
*/
public class Project extends IdEntity {
private String name;
private User manager;
private List<User> userList = Lists.newArrayList();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getManager() {
return manager;
}
public void setManager(User manager) {
this.manager = manager;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
......@@ -13,6 +13,7 @@ import javax.persistence.Transient;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.springside.modules.utils.Collections3;
......@@ -80,6 +81,7 @@ public class User extends IdEntity {
this.name = name;
}
@Email
public String getEmail() {
return email;
}
......
package org.springside.examples.showcase.webservice.soap;
import javax.jws.WebParam;
import javax.jws.WebService;
import org.springside.examples.showcase.webservice.soap.response.GetProjectDetailResponse;
import org.springside.examples.showcase.webservice.soap.response.SearchUserResponse;
import org.springside.examples.showcase.webservice.soap.response.base.IdResponse;
import org.springside.examples.showcase.webservice.soap.response.dto.UserDTO;
/**
* JAX-WS2.0的WebService接口定义类.
*
* 使用JAX-WS2.0 annotation设置WSDL中的定义.
* 使用WSResult及其子类类包裹返回结果.
* 使用DTO传输对象隔绝系统内部领域对象的修改对外系统的影响.
*
* @author calvin
*/
@WebService(name = "AccountService", targetNamespace = WsConstants.NS)
public interface AccountWebService {
/**
* 获取部门的详细信息.
*/
GetProjectDetailResponse getDepartmentDetail(@WebParam(name = "id") Long id);
/**
* 搜索用户信息.
*/
SearchUserResponse searchUser(@WebParam(name = "loginName") String loginName, @WebParam(name = "name") String name);
/**
* 新建用户.
*/
IdResponse createUser(@WebParam(name = "user") UserDTO user);
}
package org.springside.examples.showcase.webservice.soap;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springside.examples.showcase.dao.UserMybatisDao;
import org.springside.examples.showcase.entity.Project;
import org.springside.examples.showcase.entity.User;
import org.springside.examples.showcase.webservice.soap.response.GetProjectDetailResponse;
import org.springside.examples.showcase.webservice.soap.response.SearchUserResponse;
import org.springside.examples.showcase.webservice.soap.response.base.IdResponse;
import org.springside.examples.showcase.webservice.soap.response.base.WSResponse;
import org.springside.examples.showcase.webservice.soap.response.dto.ProjectDTO;
import org.springside.examples.showcase.webservice.soap.response.dto.UserDTO;
import org.springside.modules.beanvalidator.BeanValidators;
import org.springside.modules.mapper.BeanMapper;
import com.google.common.collect.Maps;
/**
* WebService服务端实现类.
*
* 客户端实现见功能测试用例.
*
* @author calvin
*/
//serviceName指明WSDL中的名称, endpointInterface属性指向Interface定义类.
@WebService(serviceName = "AccountService", endpointInterface = "org.springside.examples.showcase.webservice.soap.AccountWebService", targetNamespace = WsConstants.NS)
public class AccountWebServiceImpl implements AccountWebService {
private static Logger logger = LoggerFactory.getLogger(AccountWebServiceImpl.class);
@Autowired
private UserMybatisDao userDao;
@Autowired
private final Validator validator = null;
/**
* @see AccountWebService#getDepartmentDetail()
*/
@Override
public GetProjectDetailResponse getDepartmentDetail(Long id) {
GetProjectDetailResponse response = new GetProjectDetailResponse();
try {
Validate.notNull(id, "id参数为空");
Project project = userDao.getProjectDetail(id);
Validate.notNull(project, "项目不存在(id:" + id + ")");
ProjectDTO dto = BeanMapper.map(project, ProjectDTO.class);
response.setDepartment(dto);
return response;
} catch (IllegalArgumentException e) {
return handleParameterError(response, e);
} catch (RuntimeException e) {
return handleGeneralError(response, e);
}
}
/**
* @see AccountWebService#searchUser()
*/
@Override
public SearchUserResponse searchUser(String loginName, String name) {
SearchUserResponse response = new SearchUserResponse();
try {
Map<String, Object> parameters = Maps.newHashMap();
parameters.put("loginName", loginName);
parameters.put("name", name);
List<User> userList = userDao.searchUser(parameters);
List<UserDTO> dtoList = BeanMapper.mapList(userList, UserDTO.class);
response.setUserList(dtoList);
return response;
} catch (RuntimeException e) {
return handleGeneralError(response, e);
}
}
/**
* @see AccountWebService#createUser()
*/
@Override
public IdResponse createUser(UserDTO user) {
IdResponse response = new IdResponse();
try {
Validate.notNull(user, "用户参数为空");
User userEntity = BeanMapper.map(user, User.class);
BeanValidators.validateWithException(validator, userEntity);
Long userId = userDao.saveUser(userEntity);
return new IdResponse(userId);
} catch (ConstraintViolationException e) {
String message = StringUtils.join(BeanValidators.extractPropertyAndMessageAsList(e, " "), "\n");
logger.error(message, e);
return response.setError(WSResponse.PARAMETER_ERROR, message);
} catch (DataIntegrityViolationException e) {
String message = "新建用户参数存在唯一性冲突(用户:" + user + ")";
logger.error(message, e);
return response.setError(WSResponse.PARAMETER_ERROR, message);
} catch (RuntimeException e) {
return handleGeneralError(response, e);
}
}
private <T extends WSResponse> T handleParameterError(T response, IllegalArgumentException e) {
logger.error(e.getMessage());
return response.setError(WSResponse.PARAMETER_ERROR, e.getMessage());
}
private <T extends WSResponse> T handleGeneralError(T response, Exception e) {
logger.error(e.getMessage());
return response.setDefaultError();
}
}
package org.springside.examples.showcase.webservice.soap;
/**
* WebService常量定义.
*
* @author calvin
*/
public class WsConstants {
/**项目内统一的NameSpace定义.**/
public static final String NS = "http://shwocase.examples.springside.org";
}
package org.springside.examples.showcase.webservice.soap.response;
import javax.xml.bind.annotation.XmlType;
import org.springside.examples.showcase.webservice.soap.WsConstants;
import org.springside.examples.showcase.webservice.soap.response.base.WSResponse;
import org.springside.examples.showcase.webservice.soap.response.dto.ProjectDTO;
@XmlType(name = "GetProjectDetailResponse", namespace = WsConstants.NS)
public class GetProjectDetailResponse extends WSResponse {
private ProjectDTO department;
public GetProjectDetailResponse() {
}
public GetProjectDetailResponse(ProjectDTO department) {
this.department = department;
}
public ProjectDTO getDepartment() {
return department;
}
public void setDepartment(ProjectDTO department) {
this.department = department;
}
}
package org.springside.examples.showcase.webservice.soap.response;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlType;
import org.springside.examples.showcase.webservice.soap.WsConstants;
import org.springside.examples.showcase.webservice.soap.response.base.WSResponse;
import org.springside.examples.showcase.webservice.soap.response.dto.UserDTO;
@XmlType(name = "UserListResponse", namespace = WsConstants.NS)
public class SearchUserResponse extends WSResponse {
private List<UserDTO> userList;
public SearchUserResponse() {
}
public SearchUserResponse(List<UserDTO> userList) {
this.userList = userList;
}
@XmlElementWrapper(name = "userList")
@XmlElement(name = "user")
public List<UserDTO> getUserList() {
return userList;
}
public void setUserList(List<UserDTO> userList) {
this.userList = userList;
}
}
package org.springside.examples.showcase.webservice.soap.response.base;
import javax.xml.bind.annotation.XmlType;
import org.springside.examples.showcase.webservice.soap.WsConstants;
/**
* 创建某个对象返回的 通用IdResult
*
* @author badqiu
*
*/
@XmlType(name = "IdResponse", namespace = WsConstants.NS)
public class IdResponse extends WSResponse {
private Long id;
public IdResponse() {
}
public IdResponse(Long id) {
super();
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
package org.springside.examples.showcase.webservice.soap.response.base;
import javax.xml.bind.annotation.XmlType;
import org.springside.examples.showcase.webservice.soap.WsConstants;
/**
* WebService返回结果基类,定义所有返回码.
*
* @author calvin
*/
@XmlType(name = "WSResponse", namespace = WsConstants.NS)
public class WSResponse {
//-- 返回代码定义 --//
// 按项目的规则进行定义, 比如4xx代表客户端参数错误,5xx代表服务端业务错误等.
public static final String SUCESS = "0";
public static final String PARAMETER_ERROR = "400";
public static final String SYSTEM_ERROR = "500";
public static final String SYSTEM_ERROR_MESSAGE = "Runtime unknown internal error.";
//-- WSResult基本属性 --//
private String code = SUCESS;
private String message;
/**
* 创建结果.
*/
public <T extends WSResponse> T setError(String resultCode, String resultMessage) {
code = resultCode;
message = resultMessage;
return (T) this;
}
/**
* 创建默认异常结果.
*/
public <T extends WSResponse> T setDefaultError() {
return (T) setError(SYSTEM_ERROR, SYSTEM_ERROR_MESSAGE);
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package org.springside.examples.showcase.webservice.soap.response.dto;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springside.examples.showcase.webservice.soap.WsConstants;
import com.google.common.collect.Lists;
@XmlRootElement
@XmlType(name = "Project", namespace = WsConstants.NS)
public class ProjectDTO {
private String name;
private UserDTO manager;
private List<UserDTO> userList = Lists.newArrayList();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UserDTO getManager() {
return manager;
}
public void setManager(UserDTO manager) {
this.manager = manager;
}
//配置输出xml为<userList><User><id>1</id></User></userList>
@XmlElementWrapper(name = "userList")
@XmlElement(name = "User")
public List<UserDTO> getUserList() {
return userList;
}
public void setUserList(List<UserDTO> userList) {
this.userList = userList;
}
/**
* 重新实现toString()函数方便在日志中打印DTO信息.
*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
package org.springside.examples.showcase.webservice.soap.response.dto;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springside.examples.showcase.webservice.soap.WsConstants;
/**
* Web Service传输User信息的DTO.
*
* 只传输外部接口需要的属性.使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.
*
* @author calvin
*/
@XmlRootElement
@XmlType(name = "User", namespace = WsConstants.NS)
public class UserDTO {
private Long id;
private String loginName;
private String name;
private String email;
private ProjectDTO department;
public Long getId() {
return id;
}
public void setId(Long value) {
id = value;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String value) {
loginName = value;
}
public String getName() {
return name;
}
public void setName(String value) {
name = value;
}
public String getEmail() {
return email;
}
public void setEmail(String value) {
email = value;
}
public ProjectDTO getDepartment() {
return department;
}
public void setDepartment(ProjectDTO department) {
this.department = department;
}
/**
* 重新实现toString()函数方便在日志中打印DTO信息.
*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
......@@ -15,5 +15,6 @@
<import resource="schedule/applicationContext-quartz-cron-local.xml" />
<import resource="schedule/applicationContext-quartz-timer-cluster.xml" />
<import resource="security/applicationContext-shiro.xml" />
<import resource="webservice/applicationContext-soap-server.xml" />
</beans>
\ No newline at end of file
......@@ -55,9 +55,10 @@
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />
<!-- 定义aspectj -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- hibernat validator -->
<!-- hibernate validator -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<!-- production/local development环境 -->
......
<?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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
default-lazy-init="true">
<description>Apache CXF的Web Service配置</description>
<!-- jax-ws endpoint定义 -->
<jaxws:endpoint address="/accountservice">
<jaxws:implementor ref="accountWebService" />
</jaxws:endpoint>
<!-- WebService的实现Bean定义 -->
<bean id="accountWebService" class="org.springside.examples.showcase.webservice.soap.AccountWebServiceImpl" />
</beans>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<html>
<head>
<title>Restful Service高级演示</title>
......@@ -14,7 +16,8 @@
<h2>传统SOAP Web Service演示</h2>
<ul>
<li>基于JAX-WS.</li>
<li>服务端是基于CXF的JAX-WS演示. 详见由CXF自动生成的<a href="${ctx}/soap">服务信息及wsdl文件</a>.</li>
<li>客户端见Functional Test用例.</li>
</ul>
</body>
</html>
\ No newline at end of file
......@@ -39,6 +39,15 @@
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/soap/*</url-pattern>
</servlet-mapping>
<!-- JMX JSON Agent servlet-->
<servlet>
......
package org.springside.examples.showcase.functional.soap;
import static org.junit.Assert.*;
import javax.xml.ws.BindingProvider;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.springside.examples.showcase.functional.BaseFunctionalTestCase;
import org.springside.examples.showcase.webservice.soap.AccountWebService;
import org.springside.examples.showcase.webservice.soap.response.SearchUserResponse;
import org.springside.modules.test.category.Smoke;
/**
* UserService Web服务的功能测试, 测试主要的接口调用.
*
* 以用JAXWS的API, 根据AccountWebService接口自行创建.
*
* @author calvin
*/
public class AccountWebServiceWithDynamicCreateClientFT extends BaseFunctionalTestCase {
public AccountWebService creatClient() {
String address = baseUrl + "/soap/accountservice";
JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
proxyFactory.setAddress(address);
proxyFactory.setServiceClass(AccountWebService.class);
AccountWebService accountWebServiceProxy = (AccountWebService) proxyFactory.create();
//(可选)演示重新设定endpoint address.
((BindingProvider) accountWebServiceProxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
address);
//(可选)演示重新设定Timeout时间
Client client = ClientProxy.getClient(accountWebServiceProxy);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy policy = conduit.getClient();
policy.setReceiveTimeout(600000);
return accountWebServiceProxy;
}
/**
* 测试搜索用户
*/
@Test
@Category(Smoke.class)
public void searchUser() {
AccountWebService accountWebService = creatClient();
SearchUserResponse result = accountWebService.searchUser(null, null);
assertTrue(result.getUserList().size() >= 4);
assertEquals("Jack", result.getUserList().get(0).getName());
}
}
package org.springside.examples.showcase.functional.soap;
import static org.junit.Assert.*;
import org.dozer.DozerBeanMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springside.examples.showcase.data.UserData;
import org.springside.examples.showcase.entity.User;
import org.springside.examples.showcase.functional.BaseFunctionalTestCase;
import org.springside.examples.showcase.webservice.soap.AccountWebService;
import org.springside.examples.showcase.webservice.soap.response.base.IdResponse;
import org.springside.examples.showcase.webservice.soap.response.base.WSResponse;
import org.springside.examples.showcase.webservice.soap.response.dto.UserDTO;
/**
* UserService Web服务的功能测试, 测试主要的接口调用.
*
* 使用在Spring applicaitonContext.xml中用<jaxws:client/>,根据AccountWebService接口创建的Client.
*
* @author calvin
*/
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })
@ContextConfiguration(locations = { "/applicationContext-soap-client.xml" })
public class AccountWebServiceWithPredefineClientFT extends BaseFunctionalTestCase {
@Autowired
private AccountWebService accountWebServiceClient;
/**
* 测试创建用户,在Spring applicaitonContext.xml中用<jaxws:client/>创建Client.
*/
@Test
public void createUser() {
User user = UserData.randomUser();
UserDTO userDTO = new UserDTO();
userDTO.setLoginName(user.getLoginName());
userDTO.setName(user.getName());
userDTO.setEmail(user.getEmail());
IdResponse result = accountWebServiceClient.createUser(userDTO);
assertNotNull(result.getId());
}
/**
* 测试创建用户,使用错误的登录名, 在Spring applicaitonContext.xml中用<jaxws:client/>创建Client.
*/
@Test
public void createUserWithInvalidLoginName() {
User user = UserData.randomUser();
UserDTO userDTO = new DozerBeanMapper().map(user, UserDTO.class);
//登录名为空
userDTO.setLoginName(null);
IdResponse result = accountWebServiceClient.createUser(userDTO);
assertEquals(result.getCode(), WSResponse.PARAMETER_ERROR);
//登录名重复
userDTO.setLoginName("user1");
result = accountWebServiceClient.createUser(userDTO);
assertEquals(result.getCode(), WSResponse.PARAMETER_ERROR);
}
}
<?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:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core" 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.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"
default-lazy-init="true">
<description>Apache CXF Web Service Client端配置</description>
<context:property-placeholder ignore-resource-not-found="true"
location="classpath*:/application.functional.properties,
classpath*:/application.functional-local.properties" />
<jaxws:client id="accountWebServiceClient" serviceClass="org.springside.examples.showcase.webservice.soap.AccountWebService"
address="${baseUrl}/soap/accountservice" />
</beans>
......@@ -56,6 +56,11 @@
<artifactId>commons-io</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
......
......@@ -15,7 +15,7 @@
<aspectj.version>1.7.0</aspectj.version>
<hibernate.version>4.1.5.SP1</hibernate.version>
<mybatis.version>3.1.1</mybatis.version>
<spring-data-jpa.version>1.1.1.RELEASE</spring-data-jpa.version>
<spring-data-jpa.version>1.1.0.RELEASE</spring-data-jpa.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
<sitemesh.version>2.4.2</sitemesh.version>
<shiro.version>1.2.0</shiro.version>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册