如何在 apache sling 和 neba 环境中 return json 来自 spring 控制器的数据

How to return json data from spring controller in apache sling and neba environment

我正在使用 Neba library along with Apache sling

现在我的 spring 控制器可以正常使用此代码。

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

命中后urlhttp://localhost:8080/bin/mvc.do/category/list

我收到回复“Hello World!

但是当我尝试 return 像这样列出字符串时 -

@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

我的库中确实有 jackson databind

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

我还检查了 bundle jar 它在 lib 中有这些库。仍然不确定为什么它不起作用。非常感谢任何帮助。

如果你想 return JSON 使用 RestController 和 Jackson,你必须像这样使用 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;
    }
}

要启用 Spring 对来自控制器响应的 JSON 转换的支持,请部署 jackson-databind、jackson-core、jackson-annotations 包。 Spring 然后选择这些包(这可能需要 refresh/restart 的 Sling)并自动添加新的消息转换器,它使用 jackson 将 @Controller 方法返回的 Objects 转换为 JSON,例如:

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

注意:实际上必须部署这些 jackson 包。仅有 jackson 包的可用性是不够的,因为 NEBA 附带的 Spring 包具有可选的 require-bundle(不是 import-package)对 jackson 的依赖性(请参阅 neba-155 了解原因也就是)。

NEBA sample project 现在包含 jackson 包,因此您可以将其用作尝试从控制器响应自动 JSON 转换的起点。

关于 Tim 的上述评论,不必 手动转换。 Spring MVC 可以基于 content-negotiation 通过请求的 "Accept" header 和可用的 Spring 消息转换器自动执行此操作,请参阅 $ 28.10。 2 Spring 文档中的 HTTP 消息转换

希望对您有所帮助!