2016-01-14 20 views
0

我有一个序列化spring管理bean的问题。spring序列化自动编写的字段

我想返回自动连接bean作为一个restcontroller的响应。我读过几个回复,其中一个建议使用simpleFilter。(Use SimpleFilter to exclude non required fields.)。不过,我不认为这个建议是很实际的,而且我相信有更简单更具体的解决问题的方法。

我有一个春天的托管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和没有属性发现(以避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链来创建BeanSerializer:ATM.Job.JobStatus $$ EnhancerBySpringCGLIB $$ be675215 [ “回调”])

我已经尝试将JobStatus的范围更改为“单例”和“会话”和“请求”,它没有任何区别。 我们应该如何序列化“代理”?

回答

1

创建一个视图类

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; 
    } 
} 

让你的控制器方法的返回new JobStatusView(js)或创建创建实例是一个工厂类或任何你的首选方法。

这具有从视图中分离数据的益处。稍后,如果需要,您可以在视图类中添加任何杰克逊注释,而无需将它们堆叠到原始bean中。

+1

,可以用[塞尔玛](http://www.selma-java.org/)或[推土机](http://dozer.sourceforge.net/documentation/usage.html)来自动化之间的映射数据和查看pojo – Quentin

+0

这不回答我的问题。您只需创建另一个不受Spring管理的类即可绕过它。我的问题是关于自动布线bean的序列化。谢谢。 – user2076066

0

我不知道这是否会工作,但它在其他方面为我工作。 您可以尝试在Jobstatus类上使用@Configurable(配置AspectJ编织)并在控制器中创建新的作业状态实例。每当调用JObStatus的新实例时,Spring就会注入bean。然后您可以照常序列化jobstatus对象。