Expose Rest Services
The Apache CXF is used to expose some classes/methods as REST Services.
Services use the standard interface/implementation pattern:
- interfaces and beans are located in archiva-rest-api maven module
- implementation are located in archiva-rest-services maven module
Steps to expose your class as a REST Service.
Here all the steps to expose a new class as a REST service.
Interface and data beans
All interfaces and data beans are added in the module archiva-rest-api:
- interface in the package: org.apache.archiva.rest.api.services .
- data beans in the package: org.apache.archiva.rest.api.model .
Beans
As we want to be able to expose result as json or xml type, all beans use javax.xml.bind.annotation root element :
@XmlRootElement( name = "artifact" )
public class Artifact
implements Serializable
All services will be able to return json or xml
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )JAXRS annotations
As we use interfaces/implementations pattern jaxrs annotations are only in interfaces level.
@Path( "/managedRepositoriesService/" )
public interface ManagedRepositoriesService
{
// simple GET method no parameter
@Path( "getManagedRepositories" )
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
List<ManagedRepository> getManagedRepositories()
throws ArchivaRestServiceException;
// GET method with a path parameter
@Path( "getManagedRepository/{repositoryId}" )
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
ManagedRepository getManagedRepository( @PathParam( "repositoryId" ) String repositoryId )
throws ArchivaRestServiceException;
// POST method to pass a data bean
@Path( "addManagedRepository" )
@POST
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
ManagedRepository addManagedRepository( ManagedRepository managedRepository )
throws ArchivaRestServiceException;CXF/Spring configuration
REST services implementations are marked with the Spring annotation @Service
package org.apache.archiva.rest.services;
......
@Service( "managedRepositoriesService#rest" )
public class DefaultManagedRepositoriesService
extends AbstractRestService
implements ManagedRepositoriesServiceSpring beans are declared as REST/CXF services in the Spring configuration
<jaxrs:server id="archivaServices" address="/archivaServices">
.....
<jaxrs:serviceBeans>
<ref bean="managedRepositoriesService#rest"/>
</jaxrs:serviceBeans>
.....
</jaxrs:server>
Note as we use @Service annotation package scanning must declared in spring configuration
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd ....">
...
<context:annotation-config/>
<context:component-scan
base-package="org.apache.archiva.rest.services"/>
...
</beans>CXF servlet is declared as:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/restServices/*</url-pattern>
</servlet-mapping>So as it, REST services are availble in the following url restServices/archivaServices/.
Redback security annotation
Some REST methods need some karma, so to prevent anonymous access methods can be marked as it:
@RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
ManagedRepository addManagedRepository( ManagedRepository managedRepository )
throws ArchivaRestServiceException;This method will need the current user to have the operation manage-configuration level.
For more details, have a look at Redback REST.

