Cena
Nossa equipe agora está enfrentando o problema do encaixe da interface de dados multi-terminais. Para resolver esse problema, definimos as especificações para encaixe na interface.
O front-end (Android, iOS, front-end da Web) e o back-end discutiram as especificações do formato de dados e determinaram o formato de dados do JSON:
{"Code": "200", "Data": {"": ""}, "Mensagem": "Processado com sucesso"} {"code": "300", "Data": {"": ""}, "mensagem": "não este usuário"}}O código representa o status de processamento da solicitação: 200 é processamento normal, 300 é processamento de exceção de negócios e 500 é o processamento de exceção do sistema.
Os dados representam os dados retornados pelo plano de fundo.
O prompt de segundo plano da mensagem retornará o motivo do erro quando for normal ou bem -sucedido.
O problema está aqui
Não seria muito problemático permitir que todos envolvam o valor de retorno de cada visualização JSON?
Neste momento, a AOP será lançada. Podemos usar a idéia da AOP para envolvê -la em uma camada quando a solicitação retornar ao JSON antes de ser respondida ao cliente.
Etapas de implementação
Ativar AOP
<!-Package base se múltiplo, separado com ","-> <Contexto: componente-Scan-package = "com.we, cn.isuyang"> <Contexto: incluir filtro type = "anotação" expressão = "org.springframework.sterootype.service" /> <Contexto: exclua-filter = " Expression = "org.springframework.stereotype.controller" /> < /context: component-scan> <!-Abra Anotation-> <AOP: AspectJ-AutoProxy />
Crie uma seção
/*** JSON retorna a face tangente* <P>* Usada para processar o JSON retorna o resultado** @author zhuangjunxiang ([email protected])* @Date 28 de abril de 2017* /@componente@aspecto@(2) public class* jsonGurnreNep {*** set ppp the ppp the ppp the ppp the ppp the ppp the ppp the pp da ppin O arquivo de configuração do sistema por padrão** @param pjp tangente ponto*/ @around (value = "@annotation (org.springframework.web.bind.annotation.Responsebody)") @Order (1) Public Object Warp (Final ProceedJoinPoin PJP) Throwsable {Object List = pjp.pjp.pjp.p.p.p.pr) if (isReturnVoid (pjp)) {httpServletResponse Response = ((servletRequestAttributes) requestContextholder.getRequestAttributes ()) .getResponse (); if (isneedwrap (pjp)) {Response.getWriter (). write (jsonutil.tojson (Sucesso ("Operação é bem -sucedido"))); } Lista de retorno; } retornar dados (lista); } / ** * é o pacote necessário * * @param PJP Ponto tangente * * @return true significa que não há necessidade * / private boolean isneedwrap (PROCESSONINGJOIN PJP) {Método = Método = AspectUtil.getMethod (PJP); return! Method.isannotationPresent (void.class); } / ** * Se você deve retornar vazio * * @param pjp * @return true: o tipo de retorno é nulo, false: o tipo de retorno não é nulo * / private boolean isreturnVoid (prosseguirJoinPoint PJP) {Método Método = aspecto de aspecto (PJP); Classe <?> ReturnType = Method.getReturntype (); return "void" .Equals (returnType.getName ()); } / *** Retorne o objeto após a construção bem -sucedida* <p>* Quando a mensagem está vazia, nenhum prompt será solicitado e, se não estiver vazio, é solicitado** @param mensagem de sucesso mensagem* @return json objeto* / public static map <string, objeto> success (final string) {map <string, object> map = maputil.map (); map.put ("code", statuscode.success.key ()); map.put ("mensagem", mensagem); map.put ("dados", "); retornar mapa;} / *** retornar objeto após construção bem -sucedida* <p>* Quando a mensagem está vazia, sem prompt e nenhum prompt vazio** @param mensagem de sucesso mensagem* @return json objeto* / public static map <string, objeto> dados (dados do objeto final) {" string <string> mapTutil.map (); map.put ("Mensagem", Mensagem);
Analise
@Component Esta anotação significa entregar esse objeto ao contêiner de mola para instanciação.
@Aspect significa que esta é uma aula de faceta
@Around(value = "@annotation(org.springframework.web.bind.annotation.ResponseBody)")
Isso significa que todos os métodos com a anotação @ResponseBodybody são o ponto médio desta seção; em outras palavras, eles serão interceptados.
Perceber:
O parâmetro ProceedJoinPoint no método Warp pode usar apenas a subclasse de Junção ProceedingJoinPoint, apenas pelas notificações circundantes.
Cada tipo de ponto de conexão pode chamar o método proxy e obter e alterar o valor de retorno. Caso contrário, é para usar o junção.
Caso 1: Suponha que a função na classe controladora não precise de nenhum valor de retorno
Por exemplo: quando atualizo um objeto de entidade, só preciso retornar o resultado da atualização e está ok, e não há necessidade de preencher os dados.
Formato de dados retornado:
{"Code": "200", "Data": "", "Mensagem": "Processado com sucesso"}Ideias de implementação:
Obtenha o tipo de valor de retorno dessa função na função de processamento da classe de processamento de aspectos. Se for anulado, retorna os dados no formato especificado.
O acima isreturnVoid () é um julgamento como este.
Você só precisa alterar o valor de retorno da função para anular:
@Requestmapping@ResponseBodyPublic void Add (Long MatchId, Model Model) {SlxSignupViewService.setAddinfo (MatchId, Model);}Caso 2: Suponha que o valor de retorno da função na classe do controlador não precisa ser embrulhado
por exemplo:
O valor de retorno de alguns plug-ins front-end e encaixe de terceiros (pagamento) é especificado.
E baixar arquivos, somos redundantes.
Ideias de implementação:
Personalize a anotação para @Void:
/*** Anotação vazia* <P>* Usada para identificar o valor de retorno na camada do controlador como é** @author wangsen ([email protected])* @date 17 de agosto de 2017*/@Target (elementType.method})@Retention(retEnPoldPold.Runtime ({ElementType.Method})@Retention(retPoldPold.Runtime ({elegType.method})
Adicione esta anotação ao método da camada do controlador
/*** Pagamento concluído*/@void@ResponseBody@RequestMappingPublic void payfinish () lança ioexception {alipayviewservice.payfinish ();}Determine se essa função contém essa anotação nesta classe de processamento de seção.
Em seguida, não será processado e retornará como é.
O método ISNeedWrap () na classe JSONRETURNASPECT lida com esse requisito.
Resumir
O exposto acima é uma análise das idéias de implementação do JSON View do MVC personalizado da Spring Introduzido a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!