Skip to content

Commit

Permalink
Convenient bean-type request params.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Mar 20, 2016
1 parent a0f2160 commit 49ec89d
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 5 deletions.
15 changes: 15 additions & 0 deletions rapidoid-http-fast/src/main/java/org/rapidoid/http/Req.java
Expand Up @@ -131,6 +131,11 @@ public interface Req {
*/
String param(String name, String defaultValue);

/**
* Returns a new instance of the specified bean type, with properties initialized from the <b>URL parameters</b> of the HTTP request.
*/
<T> T param(Class<T> beanType);

/* POSTED PARAMETERS IN THE REQUEST BODY: */

/**
Expand All @@ -150,6 +155,11 @@ public interface Req {
*/
<T extends Serializable> T posted(String name, T defaultValue);

/**
* Returns a new instance of the specified bean type, with properties initialized from the <b>posted parameters</b> of the HTTP request.
*/
<T> T posted(Class<T> beanType);

/* UPLOADED FILES IN THE REQUEST BODY: */

/**
Expand Down Expand Up @@ -188,6 +198,11 @@ public interface Req {
*/
<T> T data(String name, T defaultValue);

/**
* Returns a new instance of the specified bean type, with properties initialized from the <b>data parameters</b> of the HTTP request.
*/
<T> T data(Class<T> beanType);

/* EXTRA ATTRIBUTES ATTACHED TO THE REQUEST: */

/**
Expand Down
25 changes: 25 additions & 0 deletions rapidoid-http-fast/src/main/java/org/rapidoid/http/ReqImpl.java
Expand Up @@ -25,6 +25,7 @@
import org.rapidoid.buffer.Buf;
import org.rapidoid.cls.Cls;
import org.rapidoid.commons.MediaType;
import org.rapidoid.commons.Str;
import org.rapidoid.io.Upload;
import org.rapidoid.log.Log;
import org.rapidoid.net.abstracts.Channel;
Expand Down Expand Up @@ -225,6 +226,11 @@ public String param(String name, String defaultValue) {
return withDefault(params().get(name), defaultValue);
}

@Override
public <T> T param(Class<T> beanType) {
return beanFrom(beanType, params());
}

@Override
public String header(String name) {
return U.notNull(headers().get(name), "HEADERS[%s]", name);
Expand Down Expand Up @@ -256,6 +262,11 @@ public <T extends Serializable> T posted(String name, T defaultValue) {
return withDefault(posted().get(name), defaultValue);
}

@Override
public <T> T posted(Class<T> beanType) {
return beanFrom(beanType, posted());
}

@Override
public List<Upload> files(String name) {
return U.notNull(files().get(name), "FILES[%s]", name);
Expand Down Expand Up @@ -310,6 +321,20 @@ public <T> T data(String name, T defaultValue) {
return withDefault(value, defaultValue);
}

@Override
public <T> T data(Class<T> beanType) {
return beanFrom(beanType, data());
}

private <T> T beanFrom(Class<T> beanType, Map<String, ?> properties) {
String paramName = Str.uncapitalized(beanType.getSimpleName());
try {
return (T) http.custom().beanParameterFactory().getParamValue(this, beanType, paramName, (Map<String, Object>) properties);
} catch (Exception e) {
throw new RuntimeException("Couldn't instantiate a bean of type: " + beanType.getName());
}
}

@Override
public Map<String, Object> attrs() {
return attrs;
Expand Down
Expand Up @@ -24,10 +24,12 @@
import org.rapidoid.annotation.Since;
import org.rapidoid.http.Req;

import java.util.Map;

@Authors("Nikolche Mihajlovski")
@Since("5.1.0")
public interface BeanParameterFactory {

Object getParamValue(Req req, Class<?> paramType, String paramName) throws Exception;
Object getParamValue(Req req, Class<?> paramType, String paramName, Map<String, Object> properties) throws Exception;

}
Expand Up @@ -25,13 +25,15 @@
import org.rapidoid.data.JSON;
import org.rapidoid.http.Req;

import java.util.Map;

@Authors("Nikolche Mihajlovski")
@Since("5.1.0")
public class DefaultBeanParameterFactory implements BeanParameterFactory {

@Override
public Object getParamValue(Req req, Class<?> paramType, String paramName) throws Exception {
return JSON.MAPPER.convertValue(req.data(), paramType);
public Object getParamValue(Req req, Class<?> paramType, String paramName, Map<String, Object> properties) throws Exception {
return JSON.MAPPER.convertValue(properties, paramType);
}

}
Expand Up @@ -43,7 +43,7 @@ public BeanParamRetriever(Customization customization, Class<?> type, String nam
@Override
public Object getParamValue(Req req) {
try {
return customization.beanParameterFactory().getParamValue(req, type, name);
return customization.beanParameterFactory().getParamValue(req, type, name, req.data());
} catch (Exception e) {
throw U.rte(e);
}
Expand Down
Expand Up @@ -72,7 +72,7 @@ Object aa(Num num) {

// customization
ObjectMapper mapper = new ObjectMapper();
On.custom().beanParameterFactory((req, type, name) -> mapper.convertValue(req.posted(), type));
On.custom().beanParameterFactory((req, type, name, props) -> mapper.convertValue(req.posted(), type));

// after customization
onlyPost("/aa?id=3", U.map("the-name", "three"));
Expand Down

0 comments on commit 49ec89d

Please sign in to comment.