除了在一个页面上列出每个用户外,我正在使用一个其他CRUD操作的RESTful Web服务。 getUser()方法仅用于登录webapp。我已经看了this个问题,但我没有使用命名查询。
我得到的错误::
严重:产生媒体类型冲突。资源方法公开 ... UserResource.getUser()和... UserResource.list()抛出 org.codehaus.jackson.JsonGenerationException,org.codehaus.jackson.map.JsonMappingException,产生java.io.IOException 可以生成相同的媒体类型
UserResource.list()
@GET
@Produces(MediaType.APPLICATION_JSON)
public String list() throws JsonGenerationException, JsonMappingException, IOException {
this.logger.info("list()");
ObjectWriter viewWriter;
if (this.isAdmin()) {
viewWriter = this.mapper.writerWithView(JsonViews.Admin.class);
} else {
viewWriter = this.mapper.writerWithView(JsonViews.User.class);
}
List<User> allEntries = this.userDao.findAll();
return viewWriter.writeValueAsString(allEntries);
}
UserResource.getUser()
/**
* Retrieves the currently logged in user.
*
* @return A transfer containing the username and the roles.
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
public UserTransfer getUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
if (principal instanceof String && ((String) principal).equals("anonymousUser")) {
throw new WebApplicationException(401);
}
UserDetails userDetails = (UserDetails) principal;
return new UserTransfer(userDetails.getUsername(), this.createRoleMap(userDetails));
}
提前致谢,
答案 0 :(得分:2)
您的资源是相同的路径,当Jersey需要选择一个方法(它们具有相同的HTTP方法,相同的路径,相同的媒体类型)时,没有什么可以区分它们。错误与媒体类型有关,因为完全可以在同一路径和HTTP方法上使用两种方法,只需使用不同的媒体类型。这使他们与众不同
@GET
@Produces(MediaType.APPLICATION_XML)
public String list();
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUser();
但这可能不是你想要的。所以解决方案就是改变其中一条路径
@GET
@Produces(MediaType.APPLICATION_JSON)
public String list();
@GET
@Path("/loggedInUser")
@Produces(MediaType.APPLICATION_JSON)
public String getUser();