package org.springside.examples.miniservice.rs.server;
import java.net.URI;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Response.Status;
import org.dozer.DozerBeanMapper;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.exception.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springside.examples.miniservice.entity.account.User;
import org.springside.examples.miniservice.rs.dto.UserDTO;
import org.springside.examples.miniservice.service.account.AccountManager;
import com.google.common.collect.Lists;
/**
* User资源的REST服务.
*
* @author calvin
*/
@Component
@Path("/users")
public class UserResourceService {
private static final String CHARSET = ";charset=UTF-8";
private static Logger logger = LoggerFactory.getLogger(UserResourceService.class);
@Context
private UriInfo uriInfo;
@Autowired
private AccountManager accountManager;
@Autowired
private DozerBeanMapper dozer;
/**
* 获取所有用户.
*/
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML + CHARSET })
public List<UserDTO> getAllUser() {
try {
List<User> entityList = accountManager.getAllInitedUser();
List<UserDTO> dtoList = Lists.newArrayList();
for (User userEntity : entityList) {
dtoList.add(dozer.map(userEntity, UserDTO.class));
}
return dtoList;
} catch (RuntimeException e) {
logger.error(e.getMessage(), e);
throw new WebApplicationException();
}
}
/**
* 获取用户.
*/
@GET
@Path("{id}")
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML + CHARSET })
public UserDTO getUser(@PathParam("id") Long id) {
try {
User entity = accountManager.getInitedUser(id);
UserDTO dto = dozer.map(entity, UserDTO.class);
return dto;
} catch (ObjectNotFoundException e) {
String message = "用户不存在(id:" + id + ")";
logger.error(message, e);
throw buildException(Status.NOT_FOUND, message);
} catch (RuntimeException e) {
logger.error(e.getMessage(), e);
throw new WebApplicationException();
}
}
/**
* 创建用户, 请求数据为JSON/XML格式编码的DTO, 返回表示所创建用户的URI.
*/
@POST
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML + CHARSET })
public Response createUser(UserDTO user) {
try {
User userEntity = dozer.map(user, User.class);
accountManager.saveUser(userEntity);
URI createdUri = uriInfo.getAbsolutePathBuilder().path(userEntity.getId().toString()).build();
return Response.created(createdUri).build();
} catch (ConstraintViolationException e) {
String message = "新建用户参数存在唯一性冲突(用户:" + user + ")";
logger.error(message, e);
throw buildException(Status.BAD_REQUEST.getStatusCode(), message);
} catch (RuntimeException e) {
logger.error(e.getMessage(), e);
throw new WebApplicationException();
}
}
/**
* 创建WebApplicationException, 使用标准状态码与自定义信息.
*/
private WebApplicationException buildException(Status status, String message) {
return new WebApplicationException(Response.status(status).entity(message).type(MediaType.TEXT_PLAIN).build());
}
/**
* 创建WebApplicationException, 使用自定义状态码与自定义信息.
*/
private WebApplicationException buildException(int status, String message) {
return new WebApplicationException(Response.status(status).entity(message).type(MediaType.TEXT_PLAIN).build());
}
}