All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.androidannotations.rest.spring.annotations.Rest Maven / Gradle / Ivy

There is a newer version: 4.8.0
Show newest version
/**
 * Copyright (C) 2010-2016 eBusiness Information, Excilys Group
 * Copyright (C) 2016-2017 the AndroidAnnotations project
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed To in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.androidannotations.rest.spring.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 

* Apply @{@link Rest} on an interface to create a RestService class that will * contain implementation of rest calls related to the methods you define in the * interface. *

*

* You should then inject your RestService class by using {@link RestService} * annotation in any enhanced classes. *

*

* Note: Implementation is based on Spring Android Rest-template library. So you MUST have the * library in your classpath and we highly recommend you to take some time to * read this document and understand how the library works. *

* * *

Converters

*

* Every {@link Rest} annotated interface MUST define at least one * {@link #converters()} to tell the library how to convert received data into * Java objects. *

*

* {@link #converters()} value MAY contain one or several * {@link org.springframework.http.converter.HttpMessageConverter} sub-classes *

*
* * Example : The following RestClient will use Jackson to deserialize received data * as Java objects. * *
 * @Rest(converters = MappingJackson2HttpMessageConverter.class)
 * public interface RestClient {
 * 
 * 	@Get("http://myserver/events")
 * 	EventList getEvents();
 * }
 * 
* *
* * *

Root url

*

* If you don't wan't to repeat the root URL in each method, you MAY like the * {@link #rootUrl()} field. It let you define a common root URL which will be * prefixed on every method of your RestClient. *

* *
* * Example : * *
 * @Rest(rootUrl = "http://myserver", converters = MappingJackson2HttpMessageConverter.class)
 * public interface RestClient {
 * 
 * 	@Get("/events")
 * 	EventList getEvents();
 * 
 * 	@Get("/lastevent")
 * 	Event getLastEvent();
 * }
 * 
* *
* * *

Interceptors

*

* Sometimes you may want to do extra processing right before or after requests. * {@link #interceptors()} field let you define one or several * {@link org.springframework.http.client.ClientHttpRequestInterceptor}. *

*

* An interceptor allow the developer to customize the execution flow of * requests. It may be useful to handle custom authentication, automatically log * each requests, and so on. *

*
* * Example : * *
 * @Rest(converters = MappingJacksonHttpMessageConverter.class, interceptors = HttpBasicAuthenticatorInterceptor.class)
 * public interface MyRestClient {
 * 
 * 	@Get("/events")
 * 	EventList getEvents();
 * }
 * 
 * public class HttpBasicAuthenticatorInterceptor implements ClientHttpRequestInterceptor {
 * 
 * 	@Override
 * 	public ClientHttpResponse intercept(HttpRequest request, byte[] data, ClientHttpRequestExecution execution) throws IOException {
 * 		// do something before sending request
 * 		return execution.execute(request, data);
 * 	}
 * }
 * 
* *
* *

* You can also inject {@link org.androidannotations.annotations.EBean EBean} * interceptors. Just add the annotated class (not the generated one) to the * {@link Rest#interceptors() interceptors()} parameter, and the interceptor * will be added with all of its dependencies. * *

* *

RequestFactory

*

* You can use your own request factory if you want to customize how requests * are created. The {@link #requestFactory()} parameter lets you define the * {@link org.springframework.http.client.ClientHttpRequestFactory * ClientHttpRequestFactory}. *

* *

* You can inject {@link org.androidannotations.annotations.EBean EBean} request * factories just like as interceptors. *

*
* * Example : * *
 * @Rest(converters = MappingJacksonHttpMessageConverter.class, requestFactory = MyRequestFactory.class)
 * public interface MyRestClient {
 * 
 * 	@Get("/events")
 * 	EventList getEvents();
 * }
 * 
 * public class MyRequestFactory implements ClientHttpRequestFactory {
 * 
 * 	@Override
 * 	public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
 * 		// create and return the request
 * 	}
 * }
 * 
* *
* *

ResponseErrorHandler

*

* You can use your own error handler to customize how errors * are handled. The {@link #responseErrorHandler()} parameter lets you define the * {@link org.springframework.web.client.ResponseErrorHandler * ResponseErrorHandler}. *

* *

* You can inject an {@link org.androidannotations.annotations.EBean EBean} response errork * handler just like as a request factory. *

*
* * Example : * *
 * @Rest(converters = MappingJacksonHttpMessageConverter.class, responseErrorHandler = MyResponseErrorHandler.class)
 * public interface MyRestClient {
 *
 * 	@Get("/events")
 * 	EventList getEvents();
 * }
 *
 * public class MyResponseErrorHandler implements ResponseErrorHandler {
 *
 * 	@Override
 * 	void handleError(ClientHttpResponse response) throws IOException {
 *		// handles the error in the given response
 * 	}
 *
 * 	@Override
 * 	boolean hasError(ClientHttpResponse response) throws IOException {
 * 	    // indicates whether the given response has any errors
 * 	    return true;
 * 	}
 * }
 * 
* *
* *

Magic methods

*

* AA will automatically detect and implement some methods in {@link Rest} * annotated interface. These methods will let you dynamically customize the * RestClient. *

*

RootUrl

*

* We seen earlier that root url can be set via {@link #rootUrl()} annotation * field, but it only takes a constant. If you want to dynamically inject or * retrieve the root url, you can add the following code : *

*
* *
 * @Rest(converters = MappingJacksonHttpMessageConverter.class)
 * public interface MyRestClient {
 * 
 * 	void setRootUrl(String rootUrl);
 * 
 * 	String getRootUrl();
 * }
 * 
* *
* *

RestTemplate

*

* If you want to configure the injected RestTemplate used internally, AA will * also detect getter and setter for this object. *

*
* *
 * @Rest(converters = MappingJacksonHttpMessageConverter.class)
 * public interface MyRestClient {
 * 
 * 	RestTemplate getRestTemplate();
 * 
 * 	void setRestTemplate(RestTemplate restTemplate);
 * }
 * 
* *
* *

Bundle interfaces

*

* Since 3.0, we provide some bundle interfaces, which declare the magic methods * listed above. You can extend from these interfaces, so you do not have to * write them directly in your {@link Rest} annotated interface. *

*

* Available bundle interfaces : *

*
    *
  • RestClientRootUrl: provide getRootUrl() and * setRootUrl()
  • *
  • RestClientSupport: provide getRestTemplate() and * setRestTemplate()
  • *
  • RestClientHeaders: provide getHeader(), * setHeader(), getCookie(), setCookie(), * setAuthentication() and setHttpBasicAuth()
  • *
* * * @see RestService * @see org.androidannotations.rest.spring.api.RestClientSupport * @see org.androidannotations.rest.spring.api.RestClientRootUrl * @see org.androidannotations.rest.spring.api.RestClientHeaders */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface Rest { /** * The root url of the web service. * * @return the root url of the web service */ String rootUrl() default ""; /** * The classes of the converters which should be used to convert received * data into Java objects. * * @return the converter classes */ Class[] converters(); /** * The classes of interceptors which are used to do extra processing before * or after requests. * * @return the interceptor classes */ Class[] interceptors() default {}; /** * The request factory class which is used to create the HTTP requests. * * @return the request factory class */ Class requestFactory() default Void.class; /** * The response error handler class which is used to handle errors. * * @return the response error handler class */ Class responseErrorHandler() default Void.class; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy