我想知道在处理来自对象层次结构的不同消息时,我的问题是否有一个很好的解决方案,或者是否有良好实践。
简而言之:我有一个对象层次结构,让我们说:
interface IMessage
abstract Message implements IMessage
class SimpleMessage extends Message
class ReportMessage extends SimpleMessage
class CostReportMessage extends ReportMessage
class IncomeReportMessage extends ReportMessage
... (like 3 other types, similar to the CostReportMessage)
所以我想要的是有一个传入的JAX-RS端点方法,因为大多数处理程序代码对于类是相同的,但我们需要代码中的一些条件部分。
E.g:
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML + "; charset=UTF-8", MediaType.APPLICATION_JSON + "; charset=UTF-8"})
public Response createReport( final ReportMessage, @Context HttpHeaders headers ) {
...
...
}
所以我们有一些像上面那样的方法,但是我想把它做成一个,比如接收一个传入的IMessage,然后在对象的类需要它时处理它。
你对这个问题有什么建议吗?或者你知道如何解决这类问题的最佳实践吗?
答案 0 :(得分:0)
您可以使用父类作为使用对象,然后使用BeanUtils.copyProperties()将所有属性复制到基于特定条件的新专用消息对象,例如:您在SimpleMessage中有messageTypeID变量来告诉它是什么类型的消息应该是。
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML + "; charset=UTF-8", MediaType.APPLICATION_JSON + "; charset=UTF-8"})
public Response createReport( SimpleMessage message, @Context HttpHeaders headers ) {
SimpleMessage convertedMessage;
if(//condition//) {
convertedMessage = new ReportMessage();
BeanUtils.copyProperties(convertedMessage, message);
} else { ... }
...
}
答案 1 :(得分:0)
虽然我没有找到以下解决方案“很好”或“优雅”,但这似乎有效:
步骤1.创建一个功能
private IMessage parseRequest(String request) throws IOException, JAXBException{
StringReader reader = new StringReader(request);
// unmarshaller here is a simple JAXB Unmarshaller for the message package
IMessage message = (SimpleMessage) unmarshaller.unmarshal(reader);
return message;
}
步骤2.修改jaxb入口点
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML + "; charset=UTF-8", MediaType.APPLICATION_JSON + "; charset=UTF-8"})
public Response createReport( final String request, @Context HttpHeaders headers ) {
IMessage message = parseRequest(request);
...
...
return response;
}
所以我想,这是因为以下(这只是我的理论,但我不知道在哪里寻找真相):