As camadas de serviço e enterprise respeitam por padrão os mesmo princípios sendo a camada enterprise facultativa.
 

Generalidades

A camada de serviço (ou a camada enterprise se ela existir) diz respeito aos serviços propostos para acessar a camada de persistência, objetos DAO.

As camadas de serviço e enterprise são compostas de classes que expõe seus serviços em forma de métodos à camada superior (respectivamente cliente e aplicação).

Visando o reuso e uma clara definição dos serviços propostos, deverá se implementar os façades dos serviços sob a forma de interfaces Java que estarão sucetíveis a sofrer várias implementações. Esta escolha visa o desacoplamento das camadas.

Os métodos eventuais ou classes criadas por fábricas de código no nível do serviços deverão sempre que possível ter a visibilidade reduzida (mais restrita do que public) afim de impedir a chamada destes pelas outras camadas.

Mutualização, reuso e componentização

Os serviços deverão suportar DI para poder acessar a implementação dos DAOs necessários. Eles deverão estar configurados como singleton no Spring para acessos múltiplos (multi-threading).

A obtenção de um determinado objeto de serviço pela camada cliente se dará através da API do framework Spring solicitando ao seu contexto o bean do serviço desejado.

Gestão das exceções

Por padrão todas as exceções serão unchecked, ou seja, não haverá tratamento explícito via código (try-catch) mas a assinatura de cada método deverá possuir o lançamento da exceção da camada em questão.
i.e. throws ServiceException (exceção da camada de serviço)
i.e. throws EnterpriseException (exceção camada enterprise)

Em casos específicos onde seja necessário tratar exceções nas camadas, poderão ser lançadas as exceções disponíveis por camada ou novas exceções poderão ser encapsuladas e/ou especializadas à partir destas exceções.
i.e. MySpecificServiceException extends ServiceException

Gestão das transações

Todos os tratamentos realizados pelos serviços devem ser limitados por uma transação, incluindo operações de somente leitura. O framework Spring propõe a API necessária para realizar isto de forma explícita (via código) e/ou declarativa (padrão).

Por padrão todas as transações serão declarativas para cada operação dos serviços.

Implementação

Interface Serviço com Exceção específica

Exemplo do código da interface de um serviço com uma exceção específica

Exceção específica

Exemplo do código da exceção específica

Implementação Serviço

Exemplo do código da implementação do serviço