1
0
mirror of https://gitee.com/mirrors/Spring-Cloud-Alibaba.git synced 2021-06-26 13:25:11 +08:00
This commit is contained in:
mercyblitz 2019-02-21 23:59:23 +08:00
parent a150a0cec6
commit 80252f8278
11 changed files with 142 additions and 87 deletions

View File

@ -26,7 +26,8 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.cloud.alibaba.dubbo.annotation.DubboTransported; import org.springframework.cloud.alibaba.dubbo.annotation.DubboTransported;
import org.springframework.cloud.alibaba.dubbo.client.loadbalancer.DubboAdapterLoadBalancerInterceptor; import org.springframework.cloud.alibaba.dubbo.client.loadbalancer.DubboMetadataInitializerInterceptor;
import org.springframework.cloud.alibaba.dubbo.client.loadbalancer.DubboTransporterInterceptor;
import org.springframework.cloud.alibaba.dubbo.metadata.DubboTransportedMetadata; import org.springframework.cloud.alibaba.dubbo.metadata.DubboTransportedMetadata;
import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceMetadataRepository; import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceMetadataRepository;
import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory; import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory;
@ -124,7 +125,7 @@ public class DubboLoadBalancedRestTemplateAutoConfiguration implements BeanClass
/** /**
* Adapt the instance of {@link DubboAdapterLoadBalancerInterceptor} to the {@link LoadBalancerInterceptor} Bean. * Adapt the instance of {@link DubboTransporterInterceptor} to the {@link LoadBalancerInterceptor} Bean.
* *
* @param restTemplate {@link LoadBalanced @LoadBalanced} {@link RestTemplate} Bean * @param restTemplate {@link LoadBalanced @LoadBalanced} {@link RestTemplate} Bean
* @param dubboTranslatedAttributes the annotation dubboTranslatedAttributes {@link RestTemplate} bean being annotated * @param dubboTranslatedAttributes the annotation dubboTranslatedAttributes {@link RestTemplate} bean being annotated
@ -138,11 +139,13 @@ public class DubboLoadBalancedRestTemplateAutoConfiguration implements BeanClass
int index = interceptors.indexOf(loadBalancerInterceptor); int index = interceptors.indexOf(loadBalancerInterceptor);
if (index > -1) { index = index < 0 ? 0 : index;
interceptors.set(index, new DubboAdapterLoadBalancerInterceptor(repository, loadBalancerInterceptor,
restTemplate.getMessageConverters(), classLoader, // Add ClientHttpRequestInterceptor instances before loadBalancerInterceptor
dubboTransportedMetadata, serviceFactory, contextFactory)); interceptors.add(index++, new DubboMetadataInitializerInterceptor(repository));
}
interceptors.add(index++, new DubboTransporterInterceptor(repository, restTemplate.getMessageConverters(),
classLoader, dubboTransportedMetadata, serviceFactory, contextFactory));
restTemplate.setInterceptors(interceptors); restTemplate.setInterceptors(interceptors);
} }

View File

@ -29,7 +29,7 @@ import java.io.InputStream;
* Dubbo {@link ClientHttpResponse} implementation * Dubbo {@link ClientHttpResponse} implementation
* *
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
* @see DubboAdapterLoadBalancerInterceptor * @see DubboTransporterInterceptor
*/ */
class DubboClientHttpResponse implements ClientHttpResponse { class DubboClientHttpResponse implements ClientHttpResponse {

View File

@ -0,0 +1,54 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.springframework.cloud.alibaba.dubbo.client.loadbalancer;
import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceMetadataRepository;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;
import java.net.URI;
/**
* Dubbo Metadata {@link ClientHttpRequestInterceptor} Initializing Interceptor executes intercept before
* {@link DubboTransporterInterceptor}
*
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
*/
public class DubboMetadataInitializerInterceptor implements ClientHttpRequestInterceptor {
private final DubboServiceMetadataRepository repository;
public DubboMetadataInitializerInterceptor(DubboServiceMetadataRepository repository) {
this.repository = repository;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
URI originalUri = request.getURI();
String serviceName = originalUri.getHost();
repository.initialize(serviceName);
// Execute next
return execution.execute(request, body);
}
}

View File

@ -19,7 +19,7 @@ package org.springframework.cloud.alibaba.dubbo.client.loadbalancer;
import com.alibaba.dubbo.rpc.service.GenericException; import com.alibaba.dubbo.rpc.service.GenericException;
import com.alibaba.dubbo.rpc.service.GenericService; import com.alibaba.dubbo.rpc.service.GenericService;
import org.springframework.cloud.alibaba.dubbo.http.DefaultHttpServerRequest; import org.springframework.cloud.alibaba.dubbo.http.MutableHttpServerRequest;
import org.springframework.cloud.alibaba.dubbo.metadata.DubboServiceMetadata; import org.springframework.cloud.alibaba.dubbo.metadata.DubboServiceMetadata;
import org.springframework.cloud.alibaba.dubbo.metadata.DubboTransportedMetadata; import org.springframework.cloud.alibaba.dubbo.metadata.DubboTransportedMetadata;
import org.springframework.cloud.alibaba.dubbo.metadata.RequestMetadata; import org.springframework.cloud.alibaba.dubbo.metadata.RequestMetadata;
@ -34,26 +34,28 @@ import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.CollectionUtils;
import org.springframework.util.PathMatcher;
import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponents;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.List; import java.util.List;
import java.util.Map;
import static org.springframework.web.util.UriComponentsBuilder.fromUri; import static org.springframework.web.util.UriComponentsBuilder.fromUri;
/** /**
* Dubbo {@link ClientHttpRequestInterceptor} implementation to adapt {@link LoadBalancerInterceptor} * Dubbo Transporter {@link ClientHttpRequestInterceptor} implementation
* *
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
* @see LoadBalancerInterceptor * @see LoadBalancerInterceptor
*/ */
public class DubboAdapterLoadBalancerInterceptor implements ClientHttpRequestInterceptor { public class DubboTransporterInterceptor implements ClientHttpRequestInterceptor {
private final DubboServiceMetadataRepository repository; private final DubboServiceMetadataRepository repository;
private final LoadBalancerInterceptor loadBalancerInterceptor;
private final DubboClientHttpResponseFactory clientHttpResponseFactory; private final DubboClientHttpResponseFactory clientHttpResponseFactory;
private final DubboTransportedMetadata dubboTransportedMetadata; private final DubboTransportedMetadata dubboTransportedMetadata;
@ -62,15 +64,15 @@ public class DubboAdapterLoadBalancerInterceptor implements ClientHttpRequestInt
private final DubboGenericServiceExecutionContextFactory contextFactory; private final DubboGenericServiceExecutionContextFactory contextFactory;
public DubboAdapterLoadBalancerInterceptor(DubboServiceMetadataRepository dubboServiceMetadataRepository, private final PathMatcher pathMatcher = new AntPathMatcher();
LoadBalancerInterceptor loadBalancerInterceptor,
public DubboTransporterInterceptor(DubboServiceMetadataRepository dubboServiceMetadataRepository,
List<HttpMessageConverter<?>> messageConverters, List<HttpMessageConverter<?>> messageConverters,
ClassLoader classLoader, ClassLoader classLoader,
DubboTransportedMetadata dubboTransportedMetadata, DubboTransportedMetadata dubboTransportedMetadata,
DubboGenericServiceFactory serviceFactory, DubboGenericServiceFactory serviceFactory,
DubboGenericServiceExecutionContextFactory contextFactory) { DubboGenericServiceExecutionContextFactory contextFactory) {
this.repository = dubboServiceMetadataRepository; this.repository = dubboServiceMetadataRepository;
this.loadBalancerInterceptor = loadBalancerInterceptor;
this.dubboTransportedMetadata = dubboTransportedMetadata; this.dubboTransportedMetadata = dubboTransportedMetadata;
this.clientHttpResponseFactory = new DubboClientHttpResponseFactory(messageConverters, classLoader); this.clientHttpResponseFactory = new DubboClientHttpResponseFactory(messageConverters, classLoader);
this.serviceFactory = serviceFactory; this.serviceFactory = serviceFactory;
@ -84,22 +86,24 @@ public class DubboAdapterLoadBalancerInterceptor implements ClientHttpRequestInt
String serviceName = originalUri.getHost(); String serviceName = originalUri.getHost();
repository.initialize(serviceName);
RequestMetadata clientMetadata = buildRequestMetadata(request); RequestMetadata clientMetadata = buildRequestMetadata(request);
DubboServiceMetadata dubboServiceMetadata = repository.get(serviceName, clientMetadata); DubboServiceMetadata dubboServiceMetadata = repository.get(serviceName, clientMetadata);
if (dubboServiceMetadata == null) { // if DubboServiceMetadata is not found if (dubboServiceMetadata == null) {
return loadBalancerInterceptor.intercept(request, body, execution); // if DubboServiceMetadata is not found, executes next
return execution.execute(request, body);
} }
RestMethodMetadata dubboRestMethodMetadata = dubboServiceMetadata.getRestMethodMetadata(); RestMethodMetadata dubboRestMethodMetadata = dubboServiceMetadata.getRestMethodMetadata();
GenericService genericService = serviceFactory.create(dubboServiceMetadata, dubboTransportedMetadata); GenericService genericService = serviceFactory.create(dubboServiceMetadata, dubboTransportedMetadata);
DubboGenericServiceExecutionContext context = contextFactory.create(dubboRestMethodMetadata, MutableHttpServerRequest httpServerRequest = new MutableHttpServerRequest(request, body);
new DefaultHttpServerRequest(request, body));
customizeRequest(httpServerRequest, dubboRestMethodMetadata, clientMetadata);
DubboGenericServiceExecutionContext context = contextFactory.create(dubboRestMethodMetadata, httpServerRequest);
Object result = null; Object result = null;
GenericException exception = null; GenericException exception = null;
@ -113,7 +117,22 @@ public class DubboAdapterLoadBalancerInterceptor implements ClientHttpRequestInt
return clientHttpResponseFactory.build(result, exception, clientMetadata, dubboRestMethodMetadata); return clientHttpResponseFactory.build(result, exception, clientMetadata, dubboRestMethodMetadata);
} }
public static RequestMetadata buildRequestMetadata(HttpRequest request) { protected void customizeRequest(MutableHttpServerRequest httpServerRequest,
RestMethodMetadata dubboRestMethodMetadata, RequestMetadata clientMetadata) {
RequestMetadata dubboRequestMetadata = dubboRestMethodMetadata.getRequest();
String pathPattern = dubboRequestMetadata.getPath();
Map<String, String> pathVariables = pathMatcher.extractUriTemplateVariables(pathPattern, httpServerRequest.getPath());
if (!CollectionUtils.isEmpty(pathVariables)) {
// Put path variables Map into query parameters Map
httpServerRequest.params(pathVariables);
}
}
private RequestMetadata buildRequestMetadata(HttpRequest request) {
UriComponents uriComponents = fromUri(request.getURI()).build(true); UriComponents uriComponents = fromUri(request.getURI()).build(true);
RequestMetadata requestMetadata = new RequestMetadata(); RequestMetadata requestMetadata = new RequestMetadata();
requestMetadata.setPath(uriComponents.getPath()); requestMetadata.setPath(uriComponents.getPath());

View File

@ -16,7 +16,6 @@
*/ */
package org.springframework.cloud.alibaba.dubbo.http; package org.springframework.cloud.alibaba.dubbo.http;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpRequest; import org.springframework.http.HttpRequest;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
@ -36,13 +35,8 @@ public interface HttpServerRequest extends HttpRequest, HttpInputMessage {
String getPath(); String getPath();
/** /**
* Return a read-only map with parsed and decoded query parameter values. * Return a map with parsed and decoded query parameter values.
*/ */
MultiValueMap<String, String> getQueryParams(); MultiValueMap<String, String> getQueryParams();
/**
* Return a read-only map of cookies sent by the client.
*/
MultiValueMap<String, HttpCookie> getCookies();
} }

View File

@ -26,17 +26,17 @@ import org.springframework.util.MultiValueMap;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URI; import java.net.URI;
import java.util.Map;
import static org.springframework.cloud.alibaba.dubbo.http.util.HttpUtils.getParameters; import static org.springframework.cloud.alibaba.dubbo.http.util.HttpUtils.getParameters;
import static org.springframework.cloud.alibaba.dubbo.http.util.HttpUtils.parseCookies; import static org.springframework.cloud.alibaba.dubbo.http.util.HttpUtils.parseCookies;
import static org.springframework.http.HttpHeaders.readOnlyHttpHeaders;
/** /**
* Default {@link HttpServerRequest} implementation * Mutable {@link HttpServerRequest} implementation
* *
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a> * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
*/ */
public class DefaultHttpServerRequest implements HttpServerRequest { public class MutableHttpServerRequest implements HttpServerRequest {
private final HttpMethod httpMethod; private final HttpMethod httpMethod;
@ -52,16 +52,21 @@ public class DefaultHttpServerRequest implements HttpServerRequest {
private final HttpInputMessage httpInputMessage; private final HttpInputMessage httpInputMessage;
public DefaultHttpServerRequest(HttpRequest httpRequest, byte[] body) { public MutableHttpServerRequest(HttpRequest httpRequest, byte[] body) {
this.httpMethod = httpRequest.getMethod(); this.httpMethod = httpRequest.getMethod();
this.uri = httpRequest.getURI(); this.uri = httpRequest.getURI();
this.path = uri.getPath(); this.path = uri.getPath();
this.httpHeaders = readOnlyHttpHeaders(httpRequest.getHeaders()); this.httpHeaders = new HttpHeaders(httpRequest.getHeaders());
this.queryParams = getParameters(httpRequest); this.queryParams = getParameters(httpRequest);
this.httpInputMessage = new ByteArrayHttpInputMessage(body); this.httpInputMessage = new ByteArrayHttpInputMessage(body);
this.cookies = parseCookies(httpHeaders); this.cookies = parseCookies(httpHeaders);
} }
public MutableHttpServerRequest params(Map<String, String> params) {
queryParams.setAll(params);
return this;
}
@Override @Override
public InputStream getBody() throws IOException { public InputStream getBody() throws IOException {
return httpInputMessage.getBody(); return httpInputMessage.getBody();
@ -96,9 +101,4 @@ public class DefaultHttpServerRequest implements HttpServerRequest {
public MultiValueMap<String, String> getQueryParams() { public MultiValueMap<String, String> getQueryParams() {
return queryParams; return queryParams;
} }
@Override
public MultiValueMap<String, HttpCookie> getCookies() {
return cookies;
}
} }

View File

@ -34,7 +34,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import static org.springframework.http.HttpHeaders.COOKIE; import static org.springframework.http.HttpHeaders.COOKIE;
import static org.springframework.util.CollectionUtils.unmodifiableMultiValueMap;
import static org.springframework.util.StringUtils.delimitedListToStringArray; import static org.springframework.util.StringUtils.delimitedListToStringArray;
import static org.springframework.util.StringUtils.hasText; import static org.springframework.util.StringUtils.hasText;
import static org.springframework.util.StringUtils.trimAllWhitespace; import static org.springframework.util.StringUtils.trimAllWhitespace;
@ -125,7 +124,7 @@ public abstract class HttpUtils {
addParam(parameters, name, value); addParam(parameters, name, value);
} }
} }
return unmodifiableMultiValueMap(parameters); return parameters;
} }
/** /**
@ -161,7 +160,7 @@ public abstract class HttpUtils {
cookies.add(name, httpCookie); cookies.add(name, httpCookie);
} }
return unmodifiableMultiValueMap(cookies); return cookies;
} }
/** /**

View File

@ -114,8 +114,6 @@ public class DubboServiceMetadataRepository {
object = map.get(matcher); object = map.get(matcher);
if (object == null) { // Can't match exactly if (object == null) { // Can't match exactly
// Require to match one by one // Require to match one by one
for (Map.Entry<RequestMetadataMatcher, T> entry : map.entrySet()) {
RequestMetadataMatcher possibleMatcher = entry.getKey();
HttpRequest request = builder() HttpRequest request = builder()
.method(requestMetadata.getMethod()) .method(requestMetadata.getMethod())
.path(requestMetadata.getPath()) .path(requestMetadata.getPath())
@ -123,6 +121,8 @@ public class DubboServiceMetadataRepository {
.headers(requestMetadata.getHeaders()) .headers(requestMetadata.getHeaders())
.build(); .build();
for (Map.Entry<RequestMetadataMatcher, T> entry : map.entrySet()) {
RequestMetadataMatcher possibleMatcher = entry.getKey();
if (possibleMatcher.match(request)) { if (possibleMatcher.match(request)) {
object = entry.getValue(); object = entry.getValue();
break; break;

View File

@ -31,7 +31,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@ -153,6 +152,9 @@ public class DubboSpringCloudBootstrap {
System.out.println(dubboFeignRestService.pathVariables("c", "b", "a")); System.out.println(dubboFeignRestService.pathVariables("c", "b", "a"));
// Spring Cloud Open Feign REST Call // Spring Cloud Open Feign REST Call
System.out.println(feignRestService.pathVariables("b", "a", "c")); System.out.println(feignRestService.pathVariables("b", "a", "c"));
// RestTemplate call
System.out.println(restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo//path-variables/{p1}/{p2}?v=c", String.class, "a", "b"));
} }
private void callHeaders() { private void callHeaders() {
@ -180,6 +182,9 @@ public class DubboSpringCloudBootstrap {
System.out.println(dubboFeignRestService.params("1", 1)); System.out.println(dubboFeignRestService.params("1", 1));
// Spring Cloud Open Feign REST Call // Spring Cloud Open Feign REST Call
System.out.println(feignRestService.params("1", 1)); System.out.println(feignRestService.params("1", 1));
// RestTemplate call
System.out.println(restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo/param?param=小马哥", String.class));
} }
private void callRequestBodyMap() { private void callRequestBodyMap() {
@ -190,35 +195,16 @@ public class DubboSpringCloudBootstrap {
data.put("age", 33); data.put("age", 33);
// Dubbo Service call // Dubbo Service call
System.out.println(restService.requestBody(data, "Hello,World")); System.out.println(restService.requestBodyMap(data, "Hello,World"));
// Spring Cloud Open Feign REST Call (Dubbo Transported) // Spring Cloud Open Feign REST Call (Dubbo Transported)
System.out.println(dubboFeignRestService.requestBody("Hello,World", data)); // System.out.println(dubboFeignRestService.requestBody("Hello,World", data));
// Spring Cloud Open Feign REST Call // Spring Cloud Open Feign REST Call
System.out.println(feignRestService.requestBody("Hello,World", data)); System.out.println(feignRestService.requestBody("Hello,World", data));
// RestTemplate call
System.out.println(restTemplate.postForObject("http://spring-cloud-alibaba-dubbo/request/body/map?param=小马哥", data, User.class));
} }
@Bean
public ApplicationRunner restTemplateRunner() {
return arguments -> {
ResponseEntity<String> entity = restTemplate.getForEntity("http://spring-cloud-alibaba-dubbo/param?param=小马哥", String.class);
System.out.println(entity);
Map<String, Object> data = new HashMap<>();
data.put("id", 1);
data.put("name", "小马哥");
data.put("age", 33);
User user = restTemplate.postForObject("http://spring-cloud-alibaba-dubbo/request/body/map", data, User.class);
System.out.println(restTemplate.postForObject("http://spring-cloud-alibaba-dubbo/request/body/map", data, String.class));
Map map = restTemplate.postForObject("http://spring-cloud-alibaba-dubbo/request/body/user", user, Map.class);
System.out.println(map);
};
}
@Bean @Bean
@LoadBalanced @LoadBalanced
@DubboTransported @DubboTransported

View File

@ -35,8 +35,8 @@ public interface RestService {
String form(String form); String form(String form);
User requestBody(Map<String, Object> data, String param); User requestBodyMap(Map<String, Object> data, String param);
Map<String, Object> requestBody(User user); Map<String, Object> requestBodyUser(User user);
} }

View File

@ -110,10 +110,10 @@ public class StandardRestService implements RestService {
@Override @Override
@PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE) @PostMapping(value = "/request/body/map", produces = APPLICATION_JSON_UTF8_VALUE)
@Path("/request/setBody/map") @Path("/request/body/map")
@POST @POST
@Produces(APPLICATION_JSON_VALUE) @Produces(APPLICATION_JSON_VALUE)
public User requestBody(@RequestBody Map<String, Object> data, @RequestParam("param") @QueryParam("param") String param) { public User requestBodyMap(@RequestBody Map<String, Object> data, @RequestParam("param") @QueryParam("param") String param) {
User user = new User(); User user = new User();
user.setId(((Integer) data.get("id")).longValue()); user.setId(((Integer) data.get("id")).longValue());
user.setName((String) data.get("name")); user.setName((String) data.get("name"));
@ -123,11 +123,11 @@ public class StandardRestService implements RestService {
} }
@PostMapping(value = "/request/body/user", consumes = APPLICATION_JSON_UTF8_VALUE) @PostMapping(value = "/request/body/user", consumes = APPLICATION_JSON_UTF8_VALUE)
@Path("/request/setBody/user") @Path("/request/body/user")
@POST @POST
@Override @Override
@Consumes(APPLICATION_JSON_UTF8_VALUE) @Consumes(APPLICATION_JSON_UTF8_VALUE)
public Map<String, Object> requestBody(@RequestBody User user) { public Map<String, Object> requestBodyUser(@RequestBody User user) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("id", user.getId()); map.put("id", user.getId());
map.put("name", user.getName()); map.put("name", user.getName());