@RequestBody请求是否有@PostConstruct等价物?

时间:2014-10-20 07:05:07

标签: java spring-mvc spring-3 postconstruct

我有一个类似于以下内容的网络服务:

@RequestMapping(value = "/getMovies", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody ResponseVO getMoviesList(@RequestBody RequestVO vo) { .... }

RequestVO类是:

public class RequestVO {
private String[] genreList;

    public void updateRequest() {
        if (genreList != null) {
            // remove the duplicates from the list
            // or something else
        }
    }

    public String[] getGenreList() {
        return genreList;
    }

    public void setGenreList(String[] genreList) {
        this.genreList = genreList;
    }

}

现在我希望在将请求json处理为updateRequest之后自动调用方法RequestVO。我目前想到的一件事是@PostConstruct,但在这种情况下似乎毫无用处。

我的问题是Spring提供任何此类注释或机制吗?或者@PostConstruct可以解决这个问题吗?

注意:我不需要解决方法,因为我有很多。所以请不要发布它们。以上代码仅仅是样本(请忽略小错误)。

2 个答案:

答案 0 :(得分:0)

要考虑几个方面:

  • 不要在Rest Service方法名称(如getMovies)中使用谓词,因为您使用HTTP谓词(如GET,POST等)指定操作。
  • POST应该用于在服务器上创建一个不检索它们的资源(方法名称隐含的内容:'getMovies')

在将RequestVO实例传递给RequestVO.updateRequest()之前,您想要实现的是getReportData(),是不是?如果是这样,你能详细说明,为什么不能在getReportData()的开头调用这个方法?

如果您想要实现这种功能,尽管它是否合理,请尝试:

  • 创建将在getReportData()之前调用并调用updateRequest()
  • 的新方面
  • 使用@JsonFactory(假设您使用Jackson将JSON映射到Java对象),例如:

    public class RequestVO {
    private String[] genreList;
    
    public void updateRequest() {
        if (genreList != null) {
            ...
        }
    }
    
    public String[] getGenreList() {
        return genreList;
    }
    
    public void setGenreList(String[] genreList) {
        this.genreList = genreList;
    }
    
    @JsonFactory
    public static RequestVO createExample(@JsonProperty("genreList") final String[] genreList) {
        RequestVO request = new RequestVO(genreList);
        request.updateRequest();
        return request;
    }
    

    }

答案 1 :(得分:0)

正如您所说,@PostConstruct仅在 bean 创建后调用,在此处没有用。但是在另一个方法结束后,你有2种简单的方法来调用方法。

  • explicit:将真正的方法包装在另一个方法中,并在那里进行所有预处理或后处理

    @RequestMapping(value = "/getMovies", method = RequestMethod.POST, produces = "application/json")
    public @ResponseBody ResponseVO getMoviesList(@RequestBody RequestVO vo) {
        // pre_processing
        ResponseVO resul = doGetMoviesList(vo);
        // post_processing
        return resul;
    }
    public ResponseVO doGetMoviesList(RequestVO vo) { ... }
    

编写起来很简单,即使不是非常很好

  • 使用Spring AOP。您可以定义在建议方法正常返回后将调用的返回后建议。如果需要,可以在多个类之间共享建议,并相应地编写切入点。它真的很强大,但有一点需要注意:Spring实现使用代理和默认的JDK代理。这意味着任何建议的方法应该是接口的成员并通过该接口调用。因此,建议服务比控制器更简单,更清洁。恕我直言,如果你真的需要在控制器上做AOP,你应该使用完整的AspectJ,包括类编织...总之,它非常好,非常强大,但实现起来有点困难。