如何在Apache Sling和NEBA环境中从Spring Controller返回JSON数据



我正在使用neba库以及apache吊索。

现在我的弹簧控制器可以使用此代码。

@RestController
public class CategoryController {
    @RequestMapping(value = "/category/list", method = RequestMethod.GET)
    public String sayHello() {
        return "Hello World!";
    }
}

击中URL http://localhost:8080/bin/mvc.do/category/list

我正在得到响应" 你好世界!"

但是当我尝试返回这样的列表字符串时 -

@RestController
public class CategoryController {
    @RequestMapping(value = "/category/list", method = RequestMethod.GET)
    public List<String> sayHello() {
        return new Arrays.asList(new String[]{"A","B","C"});
    }
}

我得到以下例外 -

java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.Arrays$ArrayList

我的库中确实有杰克逊数据宾灵

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.5</version>
        </dependency>

我还检查了捆绑包罐,它在lib中包含这些库。仍然不确定为什么它不起作用。任何帮助都是高度应用的。

启用Spring对Controller响应,部署Jackson-Databind,Jackson-Core,Jackson-Sannotations Bundles的JSON转换的支持。然后,弹簧拾取这些捆绑包(这可能需要刷新/重新启动的吊索),并自动添加新的消息转换器,这些消息转换器使用Jackson将 @Controller方法返回的对象转换为JSON,例如:

@RestController
public class CategoryController {
    @RequestMapping(value = "/category/list", method = RequestMethod.GET)
    public List<String> sayHello() {
        return Arrays.asList("A","B","C");
    }
}

注意:实际上,必须部署这些杰克逊捆绑包。仅杰克逊包裹的可用性就不够了,因为带有NEBA的弹簧捆绑包具有可选的要求捆绑包(不是进口包)的依赖性(请参阅Neba-155,请参阅NEBA-155)。

)。

NEBA示例项目现在包括杰克逊捆绑包,因此您可以将其用作尝试从控制器响应中自动JSON转换的起点。

关于蒂姆上面的评论,不是必须手动转换。Spring MVC可以通过请求的" Accept"标头和可用的Spring消息转换器自动基于内容 - 访问,请参见

中的 $ 28.10.2 HTTP消息转换

希望有帮助!

如果要使用RestController和Jackson返回JSON,则必须使用 ObjectMapper 这样:

@RestController
public class CategoryController {
    //Add produces application/json
    @RequestMapping(value = "/category/list", method = RequestMethod.GET, produces = "application/json")
    public List<String> sayHello() {
        ObjectMapper mapper = new ObjectMapper();
        //Object to JSON in String
        String jsonInString = mapper.writeValueAsString(new Arrays.asList(new String[]{"A","B","C"}));
        return jsonInString;
    }
}

最新更新