我使用Spring设置,使用json映射转换器将POJO类作为json发送回客户端。
例如。:
@RequestMapping
@ResponseBody
public User getUser() {
User user = getUser();
return user;
}
这将返回例如类似于客户端的内容:
{ 'username': 'My username', 'lastname': 'My lastname' }
我想截取所有控制器操作,将json包装成如下内容:
{
'status': 200,
'data': { 'username': 'My username', 'lastname': 'My lastname' }
}
最好的方法是什么?
You can also do something like this
<mvc:annotation-driven> <!-- this is added for validations to work -->
<mvc:message-converters register-defaults="true">
<ref bean="jsonMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="YourDtoWrapper"/>
</bean>
<bean id="YourDtoWrapper" class="com.YourDtoWrapper"/>
inside your YourDtoWrapper class you can do something like this
public void writeValue(JsonGenerator jgen, Object value) throws IOException, JsonGenerationException, JsonMappingException {
SomeDTO<Object> someDto = new SomeDTO<Object>("SUCCESS");//you can use an enum here
someDto.setDto(value);//here dto is a property of someDTO
super.writeValue(jgen, SomeDTO.getAsMap(someDto));
}
this will give u result some thing like this
{
serviceResult: "SUCCESS"
context: null
dto: {
id: 1
firstName: "test"
lastName: "admin"
email: "admin@test.com"
phone: 1234
userName: "admin"
password: null
createdBy: "admin"
createdDate: null
statusId: 1
statusName: "ACTIVE"
organisationId: 1
organisationName: "test"
userTypeId: 1
userTypeName: "ADMIN"
roleIds: [0]
}
}
我通过extendsMappingJackson2HttpMessageConverter
public class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//outputMessage.getHeaders().add("code", DigestUtils.md5Hex(object.toString()));
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", 200);
map.put("data", object);
super.writeInternal(map, outputMessage); //To change body of overridden methods use File | Settings | File Templates.
}
}
然后将你自己的conenterbean添加到sping-mvc配置文件中
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="com.xxx.utils.MyMappingJackson2HttpMessageConverter">
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<mvc:default-servlet-handler/>
此方法适用于每个@ResponseBody
处理程序方法。
注意,它改变了默认的Spring动作,您应该考虑一下。
简单地说,您可以创建这样的地图
@RequestMapping(value = "/user")
@ResponseBody
public Map<String, Object> getUser(){
User user = new User();
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", 200);
map.put("data", user);
return map;
}
对于常见用法,可以创建POJO
public static class ResutInfo{
private int status;
private Object data;
//get set}
然后编写控制器方法
@RequestMapping(value = "/user")
@ResponseBody
public ResutInfo getUser2(){
User user = new User();
ResutInfo resutInfo = new ResutInfo();
resutInfo.setStatus(200);
resutInfo.setData(user);
return resutInfo;
}
问题内容: 我正在尝试从Web读取JSON数据,但是该代码返回空结果。我不确定我在做什么错。 问题答案: 理想的方法 不是 使用,而是直接在阅读器上使用解码器。这是一个不错的函数,它获取url并将其响应解码到结构上。 使用示例: 您不应该在生产中使用默认结构,如最初回答的那样!(/ etc调用的是哪个)。原因是默认客户端没有设置超时。如果远程服务器无响应,那将是糟糕的一天。
如何从改造和存储到java类并访问某个地方来读取此响应??
如何从json响应中获取键“存在”的值?我之前试过 但它不起作用。如果我print_r回应,这就是正在打印的内容: 我当前的代码:
我正在尝试从json的响应中获取正文并打印这个json或能够将他放入数组。我在堆栈上找到了这篇文章:如何从http.Get获得JSON响应。有代码: 但是我不明白为什么会有“Decode(target)”和“target interface{}”。它是做什么的?为什么当我试着打印json时?NewDecoder(r.Body)没有什么有意义的。
我一直在努力学习关于如何使用的最简单的教程,我认为这是与相比的下一个最棒的教程。 例如,https://www.baeldung.com/spring-5-webclient#4-geting-a-response 因此,当我尝试对https://petstore.swagger.io/v2/pet/findbystatus?status=available执行同样的操作时,
我试图拦截来自所有promise然后方法的响应。但是我不能在原型然后方法中得到响应数据。请找到下面的代码。 在上面的代码中,我可以看到控制台打印在所有Promise调用中。但是我无法在then中获得响应对象。 控制台中打印的this对象值: “then”原型方法中的打印参数: 请建议我在then方法中获取所有promise方法的响应对象。 我尝试使用“arguments[0].arguments”