当前位置: 首页 > 知识库问答 >
问题:

泽西/Tomcat-制造媒体冲突

关浩壤
2023-03-14

我使用的是一个restful web服务,CRUD操作可以在其中工作,除了在一个页面上列出每个用户。getUser()方法仅用于登录webapp。我已经看了这个问题,但我没有使用命名查询。

我得到的错误::

严重:产生媒体类型冲突。资源方法public…UserResource.getUser()和…UserResource.list()抛出org.codehaus.jackson.JsonGenerationException、org.codehaus.jackson.map.JsonMappingException、java.io.IOException可以产生相同的媒体类型

用户资源列表()

@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));
}

提前致谢,

共有1个答案

毕瀚
2023-03-14

您的资源指向同一路径,当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();
 类似资料:
  • 我现在正在尝试泽西,按照这个链接在netbean中设置了一个网络服务。我有我的实体类和REST类。它可以从javafx2客户端添加、编辑、删除、请求对象(在本例中是用户对象)。 然而,现在我尝试向我的网络服务添加一个新方法来进行一些简单的身份验证。首先,我在Users.java文件中添加了一个新的命名查询(Users.login): 之后,我将以下代码添加到我的UsersFacadeREST.ja

  • 下面在我的restful资源类中定义了这两个方法。我在用泽西。但是当我试图运行一个单元时,它说错误,它们有相同的媒体类型。我是不是漏掉了什么? 严重:在资源和/或提供程序类中检测到以下错误和警告:严重:产生媒体类型冲突。资源方法public javax.ws.rs.core.response com.thomsonreuters.codes.sourcedocweb.resource.docume

  • 我已经为此挣扎了几个小时了。我正在用jersey开发JAX-RS。一切都很顺利,直到我不得不在一个地方返回JSON。我知道必须有一个jersey media moxy库才能将Java对象绑定到JSON格式。从Jersey media moxy到Google的genson库,我一个接一个地下载了几个JSON库。但还没有成功。用我从网上下载的Jersey media moxyhttp://www.ja

  • 我已经为此挣扎了几天,现在无法找到一个合适的解决方案。我读过类似的问题,但没有一个解决方案是充分的。 我的规格:Tomcat 9.0.0。M22,泽西2.25.1,马文4.0.0,智能2017.1.4。 让我绞尽脑汁的是,我可以在一个公共静态void main(){}函数中毫无障碍地运行代码。我想这意味着我的jar被Maven正确地包含了进去。但是,当我试图通过ServletContextList

  • 我正在尝试遵循Jersey文档,以便在发生错误时启用非200响应(https://Jersey.java.net/documentation/latest/representations.html#D0E3586) 我的代码看起来像: 不幸的是,这会产生以下错误: [2015-02-01T16:13:02.157+0000][glassfish 4.1][严重][][org.glassfish.j

  • 我可能误解了泽西岛规范,即响应的媒体类型,当一种方法可以产生几种方法之一时。根据 https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e1785,我认为当注释中列出的两种媒体类型与传入的 标头匹配时,Jersey 将遵循注释中与这些类型关联的任何权重,或者如果权重未决定获胜者,则选择第一个权重。 下面的代码演示了这