1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.server.endpoint;
18
19 import java.util.Locale;
20 import javax.xml.namespace.QName;
21
22 import org.springframework.context.MessageSource;
23 import org.springframework.context.MessageSourceAware;
24 import org.springframework.validation.Errors;
25 import org.springframework.validation.ObjectError;
26 import org.springframework.validation.Validator;
27 import org.springframework.ws.context.MessageContext;
28 import org.springframework.ws.server.endpoint.AbstractValidatingMarshallingPayloadEndpoint;
29 import org.springframework.ws.soap.SoapBody;
30 import org.springframework.ws.soap.SoapFault;
31 import org.springframework.ws.soap.SoapFaultDetail;
32 import org.springframework.ws.soap.SoapFaultDetailElement;
33 import org.springframework.ws.soap.SoapMessage;
34 import org.springframework.xml.namespace.QNameUtils;
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public abstract class AbstractFaultCreatingValidatingMarshallingPayloadEndpoint
49 extends AbstractValidatingMarshallingPayloadEndpoint implements MessageSourceAware {
50
51
52
53
54
55
56 public static final QName DEFAULT_DETAIL_ELEMENT_NAME =
57 QNameUtils.createQName("http://springframework.org/spring-ws", "ValidationError", "spring-ws");
58
59
60
61
62
63
64 public static final String DEFAULT_FAULTSTRING_OR_REASON = "Validation error";
65
66 private boolean addValidationErrorDetail = true;
67
68 private QName detailElementName = DEFAULT_DETAIL_ELEMENT_NAME;
69
70 private String faultStringOrReason = DEFAULT_FAULTSTRING_OR_REASON;
71
72 private Locale faultStringOrReasonLocale = Locale.ENGLISH;
73
74 private MessageSource messageSource;
75
76
77
78
79
80
81
82
83 public boolean getAddValidationErrorDetail() {
84 return addValidationErrorDetail;
85 }
86
87
88
89
90
91
92
93
94 public void setAddValidationErrorDetail(boolean addValidationErrorDetail) {
95 this.addValidationErrorDetail = addValidationErrorDetail;
96 }
97
98
99 public QName getDetailElementName() {
100 return detailElementName;
101 }
102
103
104
105
106
107
108
109 public void setDetailElementName(QName detailElementName) {
110 this.detailElementName = detailElementName;
111 }
112
113
114 public String getFaultStringOrReason() {
115 return faultStringOrReason;
116 }
117
118
119
120
121
122
123
124
125 public void setFaultStringOrReason(String faultStringOrReason) {
126 this.faultStringOrReason = faultStringOrReason;
127 }
128
129
130 public Locale getFaultLocale() {
131 return faultStringOrReasonLocale;
132 }
133
134
135
136
137
138
139
140 public void setFaultStringOrReasonLocale(Locale faultStringOrReasonLocale) {
141 this.faultStringOrReasonLocale = faultStringOrReasonLocale;
142 }
143
144 public final void setMessageSource(MessageSource messageSource) {
145 this.messageSource = messageSource;
146 }
147
148
149
150
151
152
153
154
155
156
157
158 @Override
159 protected final boolean onValidationErrors(MessageContext messageContext, Object requestObject, Errors errors) {
160 for (ObjectError objectError : errors.getAllErrors()) {
161 String msg = messageSource.getMessage(objectError, getFaultLocale());
162 logger.warn("Validation error on request object[" + requestObject + "]: " + msg);
163 }
164 if (messageContext.getResponse() instanceof SoapMessage) {
165 SoapMessage response = (SoapMessage) messageContext.getResponse();
166 SoapBody body = response.getSoapBody();
167 SoapFault fault = body.addClientOrSenderFault(getFaultStringOrReason(), getFaultLocale());
168 if (getAddValidationErrorDetail()) {
169 SoapFaultDetail detail = fault.addFaultDetail();
170 for (ObjectError objectError : errors.getAllErrors()) {
171 String msg = messageSource.getMessage(objectError, getFaultLocale());
172 SoapFaultDetailElement detailElement = detail.addFaultDetailElement(getDetailElementName());
173 detailElement.addText(msg);
174 }
175 }
176 }
177 return false;
178 }
179 }