当前位置: 首页 > 知识库问答 >
问题:

Rest服务中作为参数的对象数组

阳博赡
2023-03-14

我有一个接收对象数组的rest服务,我需要将json信息转换回对象列表;我的堆栈是建立在Spring4之上的

@RequestMapping(value = "/services/crud/dangers/createDanger", method = RequestMethod.GET)
    public @ResponseBody GenericServiceReturn createDanger(
            @RequestParam(value = "postionId", required = true) Long positionId,
            @RequestParam(value = "dangerName", required = true) String dangerName,
            @RequestParam(value = "type", required = true) Integer type,
            @RequestParam(value = "description", required = true) String description,
            @RequestParam(value = "words", required = true) List<RestWord> words)

正如您所看到的,参数words是RestWord的列表,其定义如下:

public class RestWord {
    private long id = -1;
    private String name;
    private long type = -1;
    

此外,我还定义了如下转换器:

public class RestWordConverter implements Converter<String, RestWord>{
    private static final Logger log = LoggerFactory
            .getLogger(RestWordConverter.class);
                    
    @Override
    public RestWord convert(String text) {
        // TODO Auto-generated method stub
        log.info(text);
        return new RestWord();
    }

}

就您所能看到的而言,没有太多的逻辑,也得到了在mvc上下文中注册的转换器,就像这样。

<mvc:annotation-driven conversion-service="conversionService" />

<beans:bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" >
        <beans:property name="converters">
            <beans:list>
                <beans:bean class="co.com.lineascontrol.core.endpoints.converters.RestWordConverter"/>
            </beans:list>
        </beans:property>
    </beans:bean>  
String words = "[{\"id\":0,\"name\":instalar,\"type\":-1},{\"id\":0,\"name\":ventilacion,\"type\":-1},{\"id\":0,\"name\":tunel,\"type\":-1}]";
c.c.l.c.e.c.RestWordConverter - [{"id":0
c.c.l.c.e.c.RestWordConverter - "name":instalar
c.c.l.c.e.c.RestWordConverter - "type":-1}
c.c.l.c.e.c.RestWordConverter - {"id":0
c.c.l.c.e.c.RestWordConverter - "name":ventilacion
c.c.l.c.e.c.RestWordConverter - "type":-1}
c.c.l.c.e.c.RestWordConverter - {"id":0
c.c.l.c.e.c.RestWordConverter - "name":tunel
c.c.l.c.e.c.RestWordConverter - "type":-1}]
<beans:bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:ref bean="jsonMessageConverter" />
            </beans:list>
        </beans:property>
    </beans:bean>

    <!-- Configure bean to convert JSON to POJO and vice versa -->
    <beans:bean id="jsonMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    </beans:bean>

嗨,万一有人在这方面挣扎,我设法使一切都启动和运行。

首先,如果您是Rest的新手,我找到了这篇简单的文章,解释了基本的,但非常重要的东西:

http://www.drdobbs.com/web-development/restful-web-services-a-tutorial/240169069?PGNO=1

@RequestMapping(value = "/services/crud/dangers/createDanger", method = RequestMethod.POST)
    public @ResponseBody GenericServiceReturn createDanger(
            @RequestBody List<RestWord> words,
            @RequestParam(value = "postionId", required = true) Long positionId,
            @RequestParam(value = "dangerName", required = true) String dangerName,
            @RequestParam(value = "type", required = true) String type,
            @RequestParam(value = "description", required = true) String description) {
List<RestWord> restWordList = new ArrayList<RestWord>();
            
            //put some values in the list! or whatever object you are using
            
            url = "http://localhost:8080/LineasControllBussinesLayer/rest/services/crud/dangers/createDanger";
            
            //add the uri params
            Map<String, Object> requestParams = new HashMap<String, Object>();
            requestParams.put("postionId", 1l);
            requestParams.put("dangerName", dangerName);
            requestParams.put("type", DANGER_TYPE.ACTIVITIE);
            requestParams.put("description", "actividad repeligrosa");
            
            // Create the request body as a MultiValueMap
            
            System.out.println(restWordList);
            //see how the HttpEntity is created with the first parameter as the object, and the second are the header, in my case I use the headers to aunteticate
            HttpEntity<List<RestWord>> entity2 = new HttpEntity<List<RestWord>>(restWordList, headers);
            
            
            //then just call the service!!!
            System.out.println(restTemplate.postForObject(url, entity2, String.class, requestParams));

共有1个答案

谷梁英毅
2023-03-14

我建议使用@resquestbodyjson映射到对象。请注意将其与@requestparam结合使用,因为它可能工作,也可能没有给定的版本,并且必须按照一定的顺序(在这种情况下,尽量避免使用@requestparam)。

看一看:Spring MVC-为什么不能使用@RequestBody和@RequestParam一起阅读,直到最后一个注释。

 类似资料:
  • 问题内容: 我已经成功地建立了一个快速测试,以创建一个“类似REST的”服务,该服务返回序列化为JSON的对象,并且这非常容易且快速(基于本文)。 但是,虽然返回桃子一样的JSON格式的对象很容易,但我还没有看到任何处理非原语输入参数的示例。如何传递复杂的对象作为参数?我正在使用Apache CXF,但也欢迎使用其他框架(例如杰克逊)的示例:) 客户端可能类似于构建javascript对象,将其传

  • 我有JavaScript代码,对象如下: 如何将Sizzle选择器引擎作为函数包含在对象中?在Sizzle源代码中,我发现了一个函数Sizzle,但源代码中还有很多函数之外的代码。 包括后我可以打电话:

  • 我可以让这段代码在没有对象作为抽象方法输入参数的情况下工作。例如,如果我亲自将方法的输入参数设置为,emp就会起作用。 当我将输入参数作为方法的对象时,它抛出了一个错误 emp不是抽象的,并且不会覆盖person类emp extends person{^

  • 当使用EasyMock为void方法设置期望值时,是否可以指定一个对象数组作为该方法的参数之一? 例如,如果我们有这样的内容: 我认为这是因为它在一个Object[]上依赖equals方法,由于两者不同,它返回false并且不满足条件。 有办法绕过它吗?因为我没有使用expect()设置expect,所以我可以使用任何()...有没有一种方法可以在void方法上做同样的事情?

  • 我有一个数组,看起来像这样: 它是一个任意长度的数组,带有许多重复字段(为了清楚起见,我将其减少为两个字段)。这被传递到JavaScript方法中。 我想知道你将如何在JSDoc中记录这一点。例如,你将如何记录问号所在的类型?

  • 我是Spring启动的新手,并试图使用枚举作为Rest请求的参数。 这是我的枚举类: 在我的控制器类中,我使用了以下方法: 这是我的JSON: 但它不起作用。。我收到以下错误: