How can i specify path value from property file in jersey?

6.2k views Asked by At

I want the path should not be hard coded rather be picked up from property such that we can change it according to our need.

Below Code works :---

@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...
        */
    }
} 

But if the class has two methods then its not working and throwing exception

Code: ---

@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...
        */
    }
} 

Exception recorded as :-----

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.  
[[FATAL] A resource model has ambiguous (sub-)resource method for HTTP method GET and input mime-types as defined by @Consumes and @Produces annotations at Java methods public javax.ws.rs.core.Response DesignationResource.getDesignations() and public javax.ws.rs.core.Response DesignationResource.getDesignationsId() at matching regular expression /([^/]+?). These two methods produces and consumes exactly the same mime-types and therefore their invocation as a resource methods will always fail.; source='org.glassfish.jersey.server.model.RuntimeResource@7e5ba613', [FATAL] A resource model has ambiguous (sub-)resource method for HTTP method GET and input mime-types as defined by @Consumes and @Produces annotations at Java methods public javax.ws.rs.core.Response source='org.glassfish.jersey.server.model.RuntimeResource@7e5ba613']  
  at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:465)  
  ...
3

There are 3 answers

2
Atilla Ozgur On

You are using same path url (servicename_designationListId) in your methods. Give different paths to your methods, like below.

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

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

As the stacktrace says, paths must be unique (or you use different media-types). I think, you want to do the following:

@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...
    */
}
0
cdeszaq On

Use the programmatic API to register resources. It will allow you to register things dynamically at runtime in ways that you can't manage via Annotations.