Json spring序列化自动连线字段

Json spring序列化自动连线字段,json,spring,serialization,jackson,autowired,Json,Spring,Serialization,Jackson,Autowired,我在序列化spring管理的bean时遇到了一个问题 我想返回一个自动连线bean作为restcontroller的响应。我已经阅读了几个回复,其中一个建议使用simpleFilter。。不过,我认为这项建议并不切实可行,而且我相信有一个更简单和具体的办法来解决这个问题 我有一个spring管理的bean,名为JobStatus @Component @Scope(value="Prototype") public class JobStatus{ private Integer jo

我在序列化spring管理的bean时遇到了一个问题

我想返回一个自动连线bean作为restcontroller的响应。我已经阅读了几个回复,其中一个建议使用simpleFilter。。不过,我认为这项建议并不切实可行,而且我相信有一个更简单和具体的办法来解决这个问题

我有一个spring管理的bean,名为JobStatus

@Component
@Scope(value="Prototype")
public class JobStatus{

    private Integer job_type;

    public Integer getJob_type() {
        return job_type;
    }

    public void setJob_type(Integer job_type) {
        this.job_type = job_type;
    }


    public JobStatus(){

    }
}
我有一个控制器,如下所示:

@RestController
public class JobController  {

@Autowired 
JobStatus js;

@RequestMapping(value = "/get_job_status", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody
JobStatus get_job_status(@RequestBody JobStatusRequest  req) {


    js.setJobType(req.getJobType);


    ObjectMapper mapper = new ObjectMapper();

    try {
        System.out.println(mapper.writeValueAsString(js));
    } catch (JsonProcessingException e) {

        e.printStackTrace();
    }



    return js;

}

}
它引发以下异常:

com.fasterxml.jackson.databind.JsonMappingException:org.springframework.cglib.proxy.NoOp$1类找不到序列化程序,也找不到创建BeanSerializer的属性为了避免异常,请通过引用链禁用空bean上的SerializationFeature.FAIL\u:ATM.Job.JobStatus$$EnhancerBySpringCGLIB$$be675215[回调]

我已经尝试将JobStatus的范围更改为singleton和session以及request,但没有任何区别。我们应该如何序列化代理?

创建一个视图类

public class JobStatusView {

    public JobStatusView(JobStatus js) {
        job_type = js.getJob_type();
    }

    private Integer job_type;

    public Integer getJob_type() {
        return job_type;
    }

    public void setJob_type(Integer job_type) {
        this.job_type = job_type;
    }
}
让您的控制器方法返回新的JobStatusViewjs,或者创建一个Factory类,或者创建实例的首选方法


这样做的好处是将数据与视图分离。如果需要,您可以稍后在视图类上添加任何Jackson注释,而不必将它们堆积到原始bean中。

我不确定这是否可行,但它在另一个上下文中对我有效。
您可以尝试在配置了AspectJ的Jobstatus类上使用@Configurable,并在控制器中创建一个新的作业状态实例。每当调用JObStatus的新实例时,Spring就会注入bean。然后,您可以像往常一样序列化jobstatus对象。

如果您可以接受只有通过公共getter方法可以访问的字段被序列化,那么您可以将Jackson配置为忽略非公共字段。这会导致代理字段未序列化:

将@Configuration bean添加到spring的Application.java类所在包中类路径的某个位置: 在其中设置ObjectMapper属性

objectMapper.setVisibilityPropertyAccessor.ALL, jsonautodect.Visibility.NONE; objectMapper.setVisibilityPropertyAccessor.GETTER, 仅限jsonautodect.Visibility.PUBLIC_

下面是一个完整的类:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import 
 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import
 org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@Configuration
public class JacksonConfig extends WebMvcConfigurerAdapter {

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        setup(objectMapper);
        return objectMapper;
    }

    public void setup(ObjectMapper objectMapper) {

        objectMapper.setVisibility(PropertyAccessor.ALL,                    
                            JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.GETTER, 
                            JsonAutoDetect.Visibility.PUBLIC_ONLY);

    }

    @Override
    public void configureMessageConverters(
                  List<HttpMessageConverter<?>> converters) {
        final MappingJackson2HttpMessageConverter converter = 
              getMappingJackson2HttpMessageConverter();

        converters.add(converter);
        super.configureMessageConverters(converters);
    }

    @Bean
    @Primary
    public MappingJackson2HttpMessageConverter
 getMappingJackson2HttpMessageConverter() {
        final MappingJackson2HttpMessageConverter converter = new 
                  MappingJackson2HttpMessageConverter();
        final ObjectMapper objectMapper = new ObjectMapper();

        setup(objectMapper);

        converter.setObjectMapper(objectMapper);
        converter.setPrettyPrint(true);
        return converter;
    }
}

您可以告诉Jackson:使用与supertype完全相同的类型序列化我的类。因为Spring代理是原始类的子类,所以至少在Spring Boot 2.0.4.RELEASE上是这样的:

@JsonSerialize(as=MyCompontClass.class)
@Component
public class MyCompontClass{
    // fields, getters, setters
}
说:

作为

公共抽象类

声明类型的超类型,其本身是运行时的超类型 查找要使用的序列化程序时要用作类型的类型


您可以使用或自动化数据和视图之间的映射。这并没有回答我的问题。您只是通过创建另一个不由spring管理的类来绕过它。我的问题是关于自动连线bean的序列化。谢谢。虽然这是一个迟到的答案:应该是被接受的答案。非常感谢你!当Jackson确实序列化了这个类时,这也帮助了我,但它也从CGLIB代理中吐出了很多属性