【问题标题】:How can i specify path value from property file in jersey?如何从球衣的属性文件中指定路径值?
【发布时间】:2014-11-18 19:22:27
【问题描述】:

我希望路径不应该被硬编码,而是从属性中获取,以便我们可以根据需要更改它。

以下代码有效:---

@Path("ws/{version}")
public class DesignationResource {

  @PathParam("version") String version = 
              Constants.API_VERSION; //(read from property file in class Constants)
  @PathParam("servicename_designationList") String servicename_designationList=
              Constants.API_POST_CITYLIST_NAME ; //(read from property file in class Constants)



  @Path("{servicename_designationList}")
  @Produces(MediaType.APPLICATION_JSON)
    public Response getDesignations()
    {
       /**
         ...CODES...
        */
    }
} 

但是如果类有两个方法,那么它不工作并抛出异常

代码:---

@Path("ws/{version}")
public class DesignationResource {

  @PathParam("version") String version = 
              Constants.API_VERSION; //(read from property file in class Constants)
  @PathParam("servicename_designationList") String servicename_designationList=
              Constants.API_POST_CITYLIST_NAME ; //(read from property file in class Constants)
  @PathParam("servicename_designationListId") String servicename_designationListId=
              Constants.API_POST_CITYLISTID_NAME ; //(read from property file in class Constants)



  @Path("{servicename_designationList}")
  @Produces(MediaType.APPLICATION_JSON)
    public Response getDesignations()
    {
       /**
         ...CODES...
        */
    }

  @Path("{servicename_designationListId}")
  @Produces(MediaType.APPLICATION_JSON)
    public Response getDesignationsId()
    {
       /**
         ...CODES...
        */
    }
} 

异常记录为:-----

org.glassfish.jersey.server.model.ModelValidationException:应用程序资源模型的验证在应用程序初始化期间失败。 [[致命] 资源模型具有用于 HTTP 方法 GET 和输入 mime 类型的模糊(子)资源方法,如 Java 方法中的 @Consumes 和 @Produces 注释定义 public javax.ws.rs.core.Response DesignationResource.getDesignations( ) 和公共 javax.ws.rs.core.Response DesignationResource.getDesignationsId() 匹配正则表达式 /([^/]+?)。这两种方法产生和使用完全相同的 mime 类型,因此它们作为资源方法的调用总是会失败。 source='org.glassfish.jersey.server.model.RuntimeResource@7e5ba613', [FATAL] 资源模型具有用于 HTTP 方法 GET 的模糊(子)资源方法以及由 @Consumes 和 @Produces 注释定义的输入 mime 类型在 Java 方法 public javax.ws.rs.core.Response source='org.glassfish.jersey.server.model.RuntimeResource@7e5ba613'] 在 org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:465) ...

【问题讨论】:

  • 每种方法的目的是什么,你能给出一个你会发送给每个人的示例 URL
  • 我只希望我的服务 URL 由属性文件控制。假设调用 getDesignations() URl 为 192.168.1.46:9090/api/ws/v1/designations,那么在未来某个时间我希望我的 URL 为 192.168.1.46:9090/api/ws/v1/desig 用于相同的目的,那么我必须更改我的属性文件而不是我的 .java

标签: java jersey jersey-2.0 jersey-1.0


【解决方案1】:

您在方法中使用了相同的路径 url (servicename_designationListId)。为您的方法提供不同的路径,如下所示。

@Path("{servicename_designations}")
  @Produces(MediaType.APPLICATION_JSON)
    public Response getDesignations()
    {
       /**
         ...CODES...
        */
    }

  @Path("{servicename_designationListId}")
  @Produces(MediaType.APPLICATION_JSON)
    public Response getDesignationsId()
    {
       /**
         ...CODES...
        */
    }

【讨论】:

  • 我使用了不同的 Path Url 。更新问题问题依旧。
  • 请提供新的堆栈跟踪。
【解决方案2】:

正如堆栈跟踪所说,路径必须是唯一的(或者您使用不同的媒体类型)。我认为,您想要执行以下操作:

@Path( Constants.API_POST_CITYLIST_NAME )
@Produces( MediaType.APPLICATION_JSON )
public Response getDesignations()
{
   /**
     ...CODES...
    */
}

@Path( Constants.API_POST_CITYLISTID_NAME )
@Produces( MediaType.APPLICATION_JSON )
public Response getDesignationsId()
{
   /**
     ...CODES...
    */
}

【讨论】:

  • 此@Path( Constants.API_POST_CITYLISTID_NAME ) 仅在 Constants.API_POST_CITYLISTID_NAME ="" 且对 Constants.API_POST_CITYLISTID_NAME=property.getproperty("")
  • 是的,注解的值必须是编译时常量。因此,我认为,唯一的解决方案是使用某种编译时工具(maven)将源代码(常量类)中的占位符替换为属性文件中的值。
【解决方案3】:

使用the programmatic API 注册资源。它将允许您以无法通过注释管理的方式在运行时动态注册事物。

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2018-08-06
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多