/******************************************************************************* * Copyright (c) 2005, 2014 springside.github.io * * Licensed under the Apache License, Version 2.0 (the "License"); *******************************************************************************/ package org.springside.examples.showcase.webservice.soap; import java.util.List; 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.apache.cxf.feature.Features; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springside.examples.showcase.entity.Team; import org.springside.examples.showcase.entity.User; import org.springside.examples.showcase.service.AccountEffectiveService; import org.springside.examples.showcase.webservice.soap.response.GetTeamDetailResult; import org.springside.examples.showcase.webservice.soap.response.GetUserResult; import org.springside.examples.showcase.webservice.soap.response.SearchUserResult; import org.springside.examples.showcase.webservice.soap.response.base.IdResult; import org.springside.examples.showcase.webservice.soap.response.base.WSResult; import org.springside.examples.showcase.webservice.soap.response.dto.TeamDTO; import org.springside.examples.showcase.webservice.soap.response.dto.UserDTO; import org.springside.modules.beanvalidator.BeanValidators; import org.springside.modules.mapper.BeanMapper; import org.springside.modules.utils.Exceptions; /** * WebService服务端实现类. * * 为演示方便,直接调用了Dao层.客户端实现见功能测试用例. * * @author calvin */ // serviceName指明WSDL中<wsdl:service>与<wsdl:binding>元素的名称, endpointInterface属性指向Interface类全称. @WebService(serviceName = "AccountService", endpointInterface = "org.springside.examples.showcase.webservice.soap.AccountSoapService", targetNamespace = WsConstants.NS) // 增加inbound/outbound SOAP内容的日志 @Features(features = "org.apache.cxf.feature.LoggingFeature") public class AccountSoapServiceImpl implements AccountSoapService { private static Logger logger = LoggerFactory.getLogger(AccountSoapServiceImpl.class); @Autowired private AccountEffectiveService accountService; @Autowired private Validator validator; /** * @see AccountSoapService#getTeamDetail(Long) */ @Override public GetTeamDetailResult getTeamDetail(Long id) { GetTeamDetailResult result = new GetTeamDetailResult(); try { Validate.notNull(id, "id参数为空"); Team team = accountService.getTeamWithDetail(id); Validate.notNull(team, "项目不存在(id:" + id + ")"); TeamDTO dto = BeanMapper.map(team, TeamDTO.class); result.setTeam(dto); return result; } catch (IllegalArgumentException e) { return handleParameterError(result, e); } catch (RuntimeException e) { return handleGeneralError(result, e); } } /** * @see AccountSoapService#getUser(Long) */ @Override public GetUserResult getUser(Long id) { GetUserResult result = new GetUserResult(); try { Validate.notNull(id, "id参数为空"); User user = accountService.getUser(id); Validate.notNull(user, "用户不存在(id:" + id + ")"); UserDTO dto = BeanMapper.map(user, UserDTO.class); result.setUser(dto); return result; } catch (IllegalArgumentException e) { return handleParameterError(result, e); } catch (RuntimeException e) { return handleGeneralError(result, e); } } /** * @see AccountSoapService#searchUser(String, String) */ @Override public SearchUserResult searchUser(String loginName, String name) { SearchUserResult result = new SearchUserResult(); try { List<User> userList = accountService.searchUser(loginName, name); List<UserDTO> dtoList = BeanMapper.mapList(userList, UserDTO.class); result.setUserList(dtoList); return result; } catch (RuntimeException e) { return handleGeneralError(result, e); } } /** * @see AccountSoapService#createUser(UserDTO) */ @Override public IdResult createUser(UserDTO user) { IdResult result = new IdResult(); try { Validate.notNull(user, "用户参数为空"); User userEntity = BeanMapper.map(user, User.class); BeanValidators.validateWithException(validator, userEntity); accountService.saveUser(userEntity); return new IdResult(userEntity.getId()); } catch (ConstraintViolationException e) { String message = StringUtils.join(BeanValidators.extractPropertyAndMessageAsList(e, " "), "\n"); return handleParameterError(result, e, message); } catch (RuntimeException e) { if (Exceptions.isCausedBy(e, DuplicateKeyException.class)) { String message = "新建用户参数存在唯一性冲突(用户:" + user + ")"; return handleParameterError(result, e, message); } else { return handleGeneralError(result, e); } } } private <T extends WSResult> T handleParameterError(T result, Exception e, String message) { logger.error(message, e.getMessage()); result.setError(WSResult.PARAMETER_ERROR, message); return result; } private <T extends WSResult> T handleParameterError(T result, Exception e) { logger.error(e.getMessage()); result.setError(WSResult.PARAMETER_ERROR, e.getMessage()); return result; } private <T extends WSResult> T handleGeneralError(T result, Exception e) { logger.error(e.getMessage()); result.setDefaultError(); return result; } }