JoiningProcessIdentificationDataType is a subtype of Structure, so treat the complete value as one structured OPC UA value carried on the wire as an ExtensionObject. Do not replace the structure with three independent method arguments unless the method definition itself declares three arguments.
Classify the OPC UA DataType
| DataType category | Wire representation |
|---|---|
Subtype of Structure
|
ExtensionObject |
Subtype of Enumeration
|
Int32 |
| Subtype of another built-in DataType | Its underlying built-in type |
The NodeSet declares JoiningProcessIdentificationDataType with NodeId ns=1;i=3029 and an inverse HasSubtype reference to i=22. Based on the supplied classification, the complete structure is encoded as an ExtensionObject. Its listed encodings are ns=1;i=5121, ns=1;i=5123, and ns=1;i=5122.
Map TrimmedString Fields
TrimmedString is a subtype outside the Structure and Enumeration categories. It therefore appears on the wire as its underlying built-in type, String. A Java data class can consequently hold each supplied field as a string while preserving its optional status.
public final class JoiningProcessIdentificationData {
public String joiningProcessId;
public String joiningProcessOriginId;
public String selectionName;
}
All three fields are marked IsOptional="true". The supplied definition allows JoiningProcessOriginId to be null when the original instance is not tracked. The evidence does not define the Java stack's mechanism for distinguishing an omitted optional field from a present null value, so use the stack's generated structure or optional-field support where available.
Define the Method Argument Correctly
If a method accepts one JoiningProcessIdentificationDataType value, define one scalar Argument whose declared DataType is ns=1;i=3029. Using three arguments with Identifiers.String changes the method signature from one structure to three scalar strings.
If the method definition genuinely declares three separate scalar inputs, Identifiers.String matches the wire-level representation of each TrimmedString. It does not preserve the declared TrimmedString subtype identity in argument metadata; use the subtype's NodeId when exact type identity is required. That NodeId is not present in the supplied evidence and must be read from the NodeSet instead of guessed.
Verify the Mapping
- Inspect the method's input-argument definition and determine whether it declares one structured input or three scalar inputs.
- For one structured input, confirm that the argument DataType is
ns=1;i=3029, the value rank is scalar, and the runtime value is encoded as anExtensionObject. - Decode the value and verify that
JoiningProcessId,JoiningProcessOriginId, andSelectionNameare handled as optional string fields.
FAQ
Is TrimmedString mapped to Identifiers.String in Java OPC UA?
TrimmedString is represented on the wire as the built-in String. Use Identifiers.String for a separate scalar argument only when preserving the declared subtype identity is unnecessary.
Should JoiningProcessIdentificationDataType become three Arguments?
Not when the method declares one structured input. Define one scalar argument with DataType ns=1;i=3029 and carry its three fields inside the structure's ExtensionObject.
How are optional JoiningProcessIdentificationDataType fields handled?
All three fields are marked optional. Preserve the Java OPC UA stack's optional-field encoding, and allow JoiningProcessOriginId to be null when origin tracking is unavailable.